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-->
- Я настроил явные ivars для моих свойств IBOutlet (
@synthesize myLabel = myLabel_
), чтобы позже я мог проверить их значения в отладчике. - Я включил точку останова в первой строке
viewDidUnload
. - Я устроила
viewDidUnload
для вызова путем имитации предупреждения памяти. - Я проверил значения явных 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
.