В iOS-разработке, что используется чаще: weak или unowned и почему?

«В iOS-разработке, что используется чаще: weak или unowned и почему?» — вопрос из категории Управление памятью, который задают на 10% собеседований IOS Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В практике iOS-разработки weak используется значительно чаще, чем unowned.

Причина: Безопасность. Ссылка weak автоматически становится nil при освобождении объекта, на который она указывала. Попытка доступа к weak свойству, которое стало nil, безопасна и просто вернет nil.

class ViewController: UIViewController {
    weak var delegate: DataLoaderDelegate? // Безопасно
    // delegate становится nil, если объект делегата деаллоцирован
}

unowned предполагает, что ссылаемый объект будет существовать на протяжении всей жизни ссылающегося объекта. Если это предположение нарушится, обращение к unowned ссылке вызовет краш приложения (небезопасное разыменование).

class Parent {
    var child: Child?
}

class Child {
    // ОПАСНО: если Parent будет деаллоцирован раньше Child, это вызовет краш.
    unowned let parent: Parent
    init(parent: Parent) { self.parent = parent }
}

Когда что использовать:

  • weak: Для опциональных связей, где объект может быть освобожден независимо (делегаты, замыкания, захваченные в них self).
  • unowned: Только когда время жизни объектов строго связано, и вы абсолютно уверены, что ссылаемый объект переживет ссылающийся. Классический (но все же рискованный) пример — захват [unowned self] в замыкании, которое гарантированно выполнится до деаллокации self.

Из-за приоритета безопасности и избегания скрытых багов, большинство команд и гайдлайнов рекомендуют weak по умолчанию.