IBOutlet и viewDidUnload под дугой

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

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

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

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

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

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

    [super viewDidUnload];
}

5 ответов


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

Как я понимаю, слабый похож на assign, поскольку они оба являются слабыми ссылками.

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

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

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

по-видимому, ARC также вводит новое "сильное" свойство, которое совпадает с "сохранить"?

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


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

к моменту вызова этого метода свойство view равно nil.

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


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

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

явные ивары все имели nil как их значение, то я попал в точку останова.


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

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


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

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