Должен ли я по-прежнему устанавливать свойства IBOutlet в null в viewDidUnload с помощью ARC?
Поскольку он по-прежнему генерирует следующий комментарий:
//Отпустите все сохраненные подпрограммы основного вида.
Должен ли я по-прежнему устанавливать свойства IBOutlet в null в viewDidUnload с помощью ARC?
Поскольку он по-прежнему генерирует следующий комментарий:
//Отпустите все сохраненные подпрограммы основного вида.
Для IBOutlets, отмеченных как сильные, вы все равно хотите их отключить в viewDidUnload.
Почему:
Когда вы получаете уведомление о низкой памяти, любые просмотры, которые в настоящее время не видны, могут выгружать себя (вызывать viewDidUnload) для сохранения памяти. Выбирая свои торговые точки, вы отказываетесь от собственности и позволяете им освобождаться. Когда представление снова загрузится (когда оно будет показано снова), розетки будут снова настроены и будет вызываться viewDidLoad.
Ну, основная цель nilling outlet заключалась в том, чтобы не создавать зомби, утечки и странные ситуации, которые могут произойти, когда subviews не имеют супер-представления, в то время как представление было выгружено из контроллера вида.
Теперь с последней версией Xcode, если вы перетаскиваете элемент вида внутри заголовка или в приватном объявлении, он автоматически устанавливает Outlet в слабый (таргетинг на iOS >= 5), а также в метод viewDidUnload
он будет писать [self setYourOutlet:nil];
Вероятно, в этом случае нет необходимости, но это хорошая практика. Если вы нацеливаете более низкие уровни, вам необходимо, потому что вы не можете использовать слабую ссылку. Я предлагаю использовать всегда, потому что это хорошая привычка.
ОБНОВЛЕНИЕ
Я хотел бы завершить ответ, чтобы избежать недоразумений (говоря только о iOS5), обратите внимание на то, что IB устанавливает выход на слабый, только если это подпункты основного вида. Обычно это происходит в xib, содержащем представление из контроллера вида.
Иногда может случиться так, что вам нужно поменять два представления на основе некоторого условия во время выполнения, не создавая их программно или в разных xib. Например, у вас есть ваш основной вид, принадлежащий vc, и в том же xib вы создаете два других представления, которые в этот момент не имеют супервизора. Если вы попытаетесь соединить их с тем же методом, созданная ссылка будет strong
. Во время выполнения вы можете теперь обменивать представления, просто добавляя или удаляя из супервизора, конечно, вы должны использовать их в viewDidUnload
.
Я разберусь на Андреа, ответьте здесь (повысьте его!), потому что ответ не прямой, если только вы не имеете в виду компоненты пользовательского интерфейса, и в этом случае они должны быть слабыми.
IBOutlets - это то, что вы их определяете. Если вы используете:
@property (nonatomic, strong) IBOutlet UIView *someView;
Вы должны использовать это при разгрузке родительского вида/окна.
Если вы выполните:
@property (nonatomic, weak) IBOutlet __weak UIView *someView;
Вам не нужно указывать переменную, потому что она будет автоматически нулевой.
Как вы ноль полностью зависит от вас. До ARC я использовал:
[someView_ release], someView_ = nil;
Теперь у вас есть два варианта: либо используйте setter (созданный с помощью @synthesize
), либо напрямую установите базовый ivar. Результат тот же - в обоих случаях квалификаторы жизненного цикла объекта будут замечать его окончательное использование и освобождать его.
Итак, действуйте так:
self.someView = nil
или
@synthesize someView = someView_;
...
someView_ = nil;