Ответ
Weak-ссылка (weak) не создаёт сильного (strong) владения объектом, что помогает избежать циклов сильных ссылок. Её ключевые ограничения:
- Всегда Optional: Поскольку weak-ссылка автоматически становится
nilпри освобождении объекта, она должна быть объявлена как опциональная (weak var delegate: SomeDelegate?). - Только для ссылочных типов: Weak работает исключительно с экземплярами классов (reference types). Для структур и перечислений (value types) она неприменима.
- Отсутствие атомарности доступа: Чтение и запись weak-переменной не являются атомарными операциями. В многопоточной среде объект может быть освобождён между проверкой на
nilи его использованием. - Не гарантирует немедленное обнуление: ARC может обнулить weak-ссылку не мгновенно, а в следующий run loop цикл.
Пример типичного использования для разрыва цикла ссылок:
class ViewController {
weak var delegate: DataProviderDelegate? // Weak, чтобы не удерживать делегата
}
class DataProvider {
var controller: ViewController? // Сильная ссылка
}
// При уничтожении DataProvider, ViewController может быть освобождён,
// так как delegate на него не держит сильную ссылку.