Мне еще нужно установить свойства IBOutlet в null в viewDidUnload с помощью ARC

Должен ли я по-прежнему устанавливать свойства IBOutlet в null в viewDidUnload с помощью ARC?

Поскольку он по-прежнему генерирует следующий комментарий:

//Отпустите все сохраненные подпрограммы основного вида.

Ответ 1

Для IBOutlets, отмеченных как сильные, вы все равно хотите их отключить в viewDidUnload.

Почему:

Когда вы получаете уведомление о низкой памяти, любые просмотры, которые в настоящее время не видны, могут выгружать себя (вызывать viewDidUnload) для сохранения памяти. Выбирая свои торговые точки, вы отказываетесь от собственности и позволяете им освобождаться. Когда представление снова загрузится (когда оно будет показано снова), розетки будут снова настроены и будет вызываться viewDidLoad.

Ответ 2

Ну, основная цель nilling outlet заключалась в том, чтобы не создавать зомби, утечки и странные ситуации, которые могут произойти, когда subviews не имеют супер-представления, в то время как представление было выгружено из контроллера вида.

Теперь с последней версией Xcode, если вы перетаскиваете элемент вида внутри заголовка или в приватном объявлении, он автоматически устанавливает Outlet в слабый (таргетинг на iOS >= 5), а также в метод viewDidUnload он будет писать [self setYourOutlet:nil]; Вероятно, в этом случае нет необходимости, но это хорошая практика. Если вы нацеливаете более низкие уровни, вам необходимо, потому что вы не можете использовать слабую ссылку. Я предлагаю использовать всегда, потому что это хорошая привычка.

ОБНОВЛЕНИЕ

Я хотел бы завершить ответ, чтобы избежать недоразумений (говоря только о iOS5), обратите внимание на то, что IB устанавливает выход на слабый, только если это подпункты основного вида. Обычно это происходит в xib, содержащем представление из контроллера вида.

Иногда может случиться так, что вам нужно поменять два представления на основе некоторого условия во время выполнения, не создавая их программно или в разных xib. Например, у вас есть ваш основной вид, принадлежащий vc, и в том же xib вы создаете два других представления, которые в этот момент не имеют супервизора. Если вы попытаетесь соединить их с тем же методом, созданная ссылка будет strong. Во время выполнения вы можете теперь обменивать представления, просто добавляя или удаляя из супервизора, конечно, вы должны использовать их в viewDidUnload.

Ответ 3

Я разберусь на Андреа, ответьте здесь (повысьте его!), потому что ответ не прямой, если только вы не имеете в виду компоненты пользовательского интерфейса, и в этом случае они должны быть слабыми.

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;