Задать нулевые объекты со строгими ссылками при включенном ARC?
Я разрабатываю приложение для iPhone с включенной опцией ARC. Я создаю IBOutlets в.h файлах, которые связаны с иконкой владельцев файлов.xib elements.for, например.
IBOutlet UIButton *bt;
@property(nonatomic,retain)IBOutlet UIButton *bt;
в.m файле, я делаю
@synthesize bt;
Есть ли необходимость явно установить bt
ноль в viewDidUnload
метод? т.е. self.bt = nil;
в viewDidUnload
?
Кроме того, мне нужно написать dealloc
метод с включенной опцией ARC? Когда я должен сделать элементы IBOutlets сильными и слабыми ссылками с включенной ARC?
2 ответа
Есть разница между необходимостью положить ваши выходы на ноль в viewDidUnload
а также dealloc
Наличие ARC означает, что вам не нужно писать это в своем dealloc
метод (это делается автоматически), однако viewDidUnload
Метод служит другой цели, и это освобождение памяти, которую приложение не использует, когда появляется предупреждение памяти.dealloc
все еще требуется в некоторых случаях, например, когда ваш класс зарегистрирован для уведомления, или когда ваш класс является чужим делегатом, и вы не хотите, чтобы какой-то сбойный обратный вызов дал вам плохой доступ
Когда вы получаете предупреждение памяти, все UIViewControllers
не отображается, выгрузит их представление и вызовет этот метод, чтобы освободить память. Если вы по-прежнему сохраняете розетки (например, кнопки, таблицы и т. Д.), Они не будут освобождены, таким образом, убивая цель метода viewDidUnload.
При использовании ARC нет необходимости использовать такие модификаторы, как retain
или же copy
, например. Такое управление памятью выполняется автоматически с использованием strong
а также weak
модификаторы.
Вам также не нужно беспокоиться о написании dealloc
методы.
strong
является своего рода эквивалентом retain
, так что вы должны пометить свои торговые точки им
@property(nonatomic, strong) IBOutlet UIButton *bt;
Именно так конструктор интерфейсов создает их по умолчанию.
Я не буду вдаваться в подробности об их семантических различиях, но вы действительно должны взглянуть на руководство Apple по переходу на ARC, если хотите знать, что происходит, и прочитать о специфике strong
а также weak
модификаторы.
РЕДАКТИРОВАТЬ: Извините, строитель интерфейса создает розетки с weak
по умолчанию.
РЕДАКТИРОВАТЬ 2:strong
а также retain
действительно на 100% идентичны. (спасибо @Adam)
РЕДАКТИРОВАТЬ 3: Вы устанавливаете свои указатели на nil
чтобы избежать message sent to deallocated instance
или же BAD_ACCESS_EXCEPTION
ошибки.
Если вы на самом деле используете ARC, вы должны сделать свои магазины (nonatomic, weak)
вместо (nonatomic, strong)
, Используя weak
Обнуляя указатели, компилятор автоматически устанавливает ваши выходы в nil
когда ничто иное не ссылается на них.
Итак, подводя итог, если вы не используете weak
свойства, вы должны установить ваши указатели на ноль.