Задать нулевые объекты со строгими ссылками при включенном 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 свойства, вы должны установить ваши указатели на ноль.

Другие вопросы по тегам