您要做的是为该类型真正可以保留的属性添加注释。
将属性声明更改为
@property (nonatomic, retain) CGImageRef image __attribute__((NSObject));
请注意,这只会为您生成 getter 和 setter,实例变量本身不受ARC 控制。具体来说,这意味着您必须在 中释放它dealloc
,并且在直接分配给实例变量时需要使用正确的保留和释放。
更好的方法可能是使用typedef
:
typedef CGImageRef CGImageObject __attribute__((NSObject));
@property (nonatomic, retain) CGImageObject image;
在这种情况下,实例变量由ARC 控制,因此您不能在 中释放它dealloc
,并且对实例变量的直接赋值也由 ARC 处理。
作为参考,请参阅规范,特别是第 4.1.1 节:
应用于__attribute__((NSObject))
非可保留对象指针类型的属性与在 ARC 之外的行为相同:它要求属性类型是某种指针并允许使用除assign
. 这些修饰符只影响合成的 getter 和 setter;对 ivar 的直接访问(即使是合成的)仍然具有原始语义,并且 ivar 中的值不会在释放期间自动释放。
和第 3 节:
可保留对象指针(或“可保留指针”)是可保留对象指针类型(“可保留类型”)的值。可保留对象指针类型共有三种:
- 块指针(通过将插入符号 (
^
) 声明符符号应用于函数类型而形成)
- Objective-C 对象指针(
id
, Class
,NSFoo*
等)
- typedef 标记为
__attribute__((NSObject))