IBOutlet и viewDidUnload под ARC - PullRequest
       33

IBOutlet и viewDidUnload под ARC

36 голосов
/ 07 октября 2011

Существует аналогичный вопрос с этим на SO здесь , однако я просто хочу уточнить кое-что, что там не было полностью объяснено.

Я понимаю, что все делегаты и выходы - вФакт, что любая ссылка на «родительский» объект, чтобы быть хорошим гражданином и задуматься о графе объектов в течение минуты - должна обнулять слабые ссылки.Из-за природы обнуления слабых указателей, автоматически сбрасываемых в ноль при достижении нуля счетчика удержания ссылочного объекта, означает ли это, что установка IBOutlets в ноль в viewDidUnload теперь не нужна?

Итак, если я объявлю свой выходвот так:

@property (nonatomic, weak) IBOutlet UILabel *myLabel;

Имеет ли следующий код какой-либо эффект?

- (void)viewDidUnload
{
    self.myLabel = nil;

    [super viewDidUnload];
}

Ответы [ 5 ]

15 голосов
/ 07 октября 2011

Просто проведу небольшое исследование ...

Насколько я понимаю, слабое похоже на присвоение в том смысле, что они оба являются слабыми ссылками.

Однако, назначение не создает нулевую ссылку. то есть, если рассматриваемый объект уничтожен, и вы получаете доступ к этому свойству, вы получите BAD_ACCESS_EXCEPTION.

Слабые свойства автоматически обнуляются (= ноль), когда объект, на который он ссылается, уничтожается.

В обоих случаях нет необходимости устанавливать свойство равным nil, так как оно не способствует сохранению количества рассматриваемого объекта. Это необходимо при использовании сохранить свойства.

По-видимому, ARC также вводит новое свойство "strong", которое совпадает с "retain"?

Исследования выполнены здесь

11 голосов
/ 07 октября 2011

Я провел небольшое тестирование, и кажется, что код в методе viewDidUnload не нужен. Чтобы поддержать это, документы для viewDidUnload действительно говорят:

К моменту вызова этого метода свойство view будет иметь значение nil.

Указывает, что слабое задание должно быть автоматически установлено на nil.

5 голосов
/ 27 февраля 2012

У меня есть некоторые эмпирические данные, подтверждающие, что IBOutlets действительно уже установлены в ноль автоматически. Вот что я сделал:

  1. Я установил явные значения ivars для своих свойств IBOutlet (@synthesize myLabel = myLabel_), чтобы впоследствии я мог проверить их значения в отладчике.
  2. Я включил точку останова в первой строке viewDidUnload.
  3. Я организовал вызов viewDidUnload, имитируя предупреждение о памяти.
  4. Я проверил значения явных иваров, которые я связал со своими свойствами IBOutlet.

Все явные ивары имели nil в качестве значения, тогда я достиг точки останова.

3 голосов
/ 25 февраля 2012

Из моего понимания того, как управляются выходы в ARC, если вы используете слабую ссылку, вам не нужно ничего добавлять к viewDidUnload, поскольку она уже будет равна нулю. Таким образом, это излишне.

Однако, если у вас есть сильные выходы, что, по словам яблока, вам следует делать, если вы указываете на элемент верхнего уровня в кончике, тогда вам определенно следует продолжить добавлять соответствующую строку в viewDidUnload, чтобы обнулить эти.

0 голосов
/ 15 марта 2013

Начиная с iOS 5 и OS X 10.7, weak создаст указатель автоматического обнуления.Это означает, что когда указанный объект освобожден, указатель автоматически устанавливается на nil (подробности см. Обнуление слабых ссылок в ARC ).

Итак, под iOS 5+ и ОСX 10.7+, бесполезно устанавливать свойства weak IBOutlet равными nil вручную в методе viewDidUnload: когда главное представление выгружается, все его подпредставления будут освобождены, поэтому будут установлены соответствующие свойствадо nil.

...