Что вы хотите сделать, это добавить аннотацию к свойству, что тип действительно может быть сохранен.
Изменить объявление свойства на
@property (nonatomic, retain) CGImageRef image __attribute__((NSObject));
Обратите внимание, что это будет генерировать только геттеры и сеттеры для вас, сама переменная экземпляра не управляемая ARC. В частности, это означает, что вы должны освободить его в dealloc
, и вам нужно использовать правильное сохранение и освобождение при назначении непосредственно переменной экземпляра.
Лучшим подходом может быть использование typedef
:
typedef CGImageRef CGImageObject __attribute__((NSObject));
@property (nonatomic, retain) CGImageObject image;
В этом случае переменная экземпляра управляется ARC, поэтому вы должны не отменить ее в dealloc
и прямые назначения переменной экземпляра также обрабатываются ARC.
Для справки см. Спецификацию , в частности , раздел 4.1.1 :
Применение __attribute__((NSObject))
к имуществу, которое не подлежит возврату
тип указателя объекта имеет то же поведение, что и вне ARC:
требует, чтобы тип свойства был своего рода указателем и разрешает
использование модификаторов, отличных от assign
. Эти модификаторы влияют только на
синтезированный геттер и сеттер; прямой доступ к ивару (даже если
синтезированный) по-прежнему имеют примитивную семантику, а значение в иваре
не будет автоматически освобожден во время освобождения.
и секция 3 :
Указатель сохраняемого объекта (или «указатель сохраняемого объекта») представляет собой значение
тип указателя сохраняемого объекта («сохраняемый тип»). Есть три
виды сохраняемых типов указателей на объекты:
- блок-указатели (сформированные путем применения символа объявления каретки (
^
) к
тип функции)
- Указатели объектов Objective C (
id
, Class
, NSFoo*
и т. Д.)
- typedefs, отмеченные
__attribute__((NSObject))