Я пытаюсь изучить автоматический подсчет ссылок в iOS 5. Теперь первая часть этого вопроса должна быть простой:
Верно ли, что мне НЕ нужно писать явные операторы свойств выпуска в моем dealloc при использовании ARC? Другими словами, правда ли, что следующее НЕ требует явного освобождения?
@interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end
Мой следующий и более важный вопрос исходит из строки в документе Transitioning to ARC Release Notes :
Вам не нужно (действительно, не можете) освобождать переменные экземпляра, но вам может потребоваться вызвать [self setDelegate: nil] для системных классов и другого кода, который не компилируется с использованием ARC.
Возникает вопрос: как узнать, какие системные классы не скомпилированы с помощью ARC? Когда мне следует создать свой собственный dealloc и явно установить для строго сохраняемых свойств значение nil? Должен ли я предполагать, что для всех классов инфраструктуры NS и UI, используемых в свойствах, требуются явные деаллоки?
Существует огромное количество информации о SO и в других местах о методах выпуска поддерживающего ivar свойства при использовании ручного отслеживания ссылок, но относительно мало об этом при использовании ARC.
источник
MyController : UIViewController
класс, который создает и владеет UIView, а также устанавливает делегата представления самому себе. Это единственный сохраняющий владелец этой точки зрения. Когда контроллер освобождается, представление также должно быть освобождено. Имеет ли значение, если указатель делегата болтается?UIWebView
, в документации явно указано, что вам нужно обнулить делегата.unsafe_unretained
в точности эквивалентенassign
свойству и является нормальным поведением для отношений делегата в MRR, и они должны быть обнулены.Просто чтобы дать противоположный ответ ...
Краткий ответ : нет, вам не нужно обнулять автосинтезированные свойства в
dealloc
ARC. И вам не нужно использовать сеттер для тех, кто вinit
.Длинный ответ : вы должны обнулить свойства, синтезированные пользователем
dealloc
, даже в ARC. И вы должны использовать сеттер для тех, кто вinit
.Дело в том, что ваши настраиваемые свойства должны быть безопасными и симметричными в отношении обнуления.
Возможный установщик таймера:
Возможный установщик для scrollview, tableview, webview, textfield, ...:
Возможный установщик для свойства KVO:
Тогда вы не должны дублировать любой код
dealloc
,didReceiveMemoryWarning
,viewDidUnload
, ... и ваше имущество может быть безопасно обнародовано. Если вы беспокоились о нулевых свойствахdealloc
, возможно, пришло время еще раз проверить свои сеттеры.источник