Теперь мой вопрос: нужно ли мне явно указывать эти свойства равными nil в моем dealloc?
Да , вы делаете с объявлением, которое выпоказано.
В разделе объявлений свойств спецификации ARC указано:
Применение __attribute__((NSObject))
к свойству, не относящемуся к типу указателя сохраняемого объекта, имеетТо же поведение, что и вне ARC: для него требуется, чтобы тип свойства был своего рода указателем, и разрешено использование модификаторов, отличных от assign
.Эти модификаторы влияют только на синтезированный геттер и сеттер;прямой доступ к ивару (даже если он синтезирован) все еще имеет примитивную семантику, и значение в иваре не будет автоматически освобождено во время освобождения .
(акцент на последнюю добавленную частьмной)
Другими словами, применение __attribute__((NSObject))
и strong
к свойству с базовым типом заставляет корректно работать методы получения и установки, но это не заставит ARC управлять базовой переменной экземпляра (посколькутип переменной экземпляра по-прежнему будет базовым типом основы), и поэтому ARC не будет освобождать переменную экземпляра после dealloc
, если она не равна нулю.С таким объявлением свойства вам нужно будет обнулить его в dealloc
или вызвать утечку.
Однако есть способ заставить ARC управлять самой переменной.Поскольку переменная имеет базовый базовый тип, вы можете сделать его управляемым ARC-типом, поместив его в typedef
с __attribute__((NSObject))
.
В разделе Указатели сохраняемых объектов Спецификация ARC гласит:
Существует три вида типов указателей объекта хранения:
- блочные указатели (сформированные путем применения сигилла объявления Caret (
^
) к функцииtype) - Указатели объектов Objective C (
id
, Class
, NSFoo*
и т. д.) - typedefs, помеченные
__attribute__((NSObject))
(акцент на последнем добавленном мной элементе)
Так что если вы сделаете typedef следующим образом:
typedef __attribute__((NSObject)) CGImageRef MyImageRef;
и объявите свою собственность следующим образом:
@property (nonatomic, strong) MyImageRef loupeImage;
базовая переменная будет управляться ARC (поскольку базовая переменная будет иметь тип typedef
'd, который является типом, управляемым ARC), и вам не нужно будет обнулять ее в dealloc
.