Должен ли я использовать __unsafe_unretained для временных переменных?
Допустим, я хочу создать временную переменную, например:
Чтобы указать на другую долгоживущую переменную:
__unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView;
Чтобы указать на объект, который я только что создал.
__unsafe_unretained UIView *tableHeaderView = [[UIView alloc] init];
Эти временные переменные не нужно хранить, потому что объекты, на которые они указывают, гарантированно сохраняют положительные значения хранения до тех пор, пока временные переменные находятся в области видимости. Итак, я должен объявить их как __unsafe_unretained
?
3 ответа
Почему это важно, если система сохраняет вашу временную переменную? И на самом деле, вы действительно хотите сохранить его.
Рассматривать:
__unsafe_unretained UIView *tableHeaderView = self.tableView.tableHeaderView
self.tableView.tableHeaderView = nil;
NSLog(@"%@", tableHeaderView); //<-I WILL CRASH
Мэтт,
Весь смысл ARC - позволить вам игнорировать подобные проблемы. Фактически, компилятор может даже не сохранять эти экземпляры.
Позвольте ARC беспокоиться об этих проблемах. Не пытайтесь помочь, пока не пожалуются компилятор или статический анализатор. (Кстати, вы позволяете анализатору работать с каждой компиляцией, верно? Он обнаруживает проблемы при их создании.)
Вам следует беспокоиться только об избыточном создании объектов в циклах и управлении созданием больших объектов. С первым обращается разумное использование @autorelease
, Вы по-прежнему управляете большими предметами, как вы делали ante-ARC.
Эндрю
Нет. Если ARC сохранит его, он отпустит, когда переменная выходит из области видимости.