CGImageRef属性保留或不保留

fis*_*ear 3 objective-c retain ios cgimageref

我有一个关于如何处理CGImageRef作为类的综合属性的问题.如果我定义CGImageRef

@property (nonatomic, retain) CGImageRef image;
Run Code Online (Sandbox Code Playgroud)

然后编译器抱怨这里不能使用"retain".如果我省略保留,那么我假设使用"assign",我需要在设置属性时自行保留:

self.image = CGImageRetain ( cgimage );
Run Code Online (Sandbox Code Playgroud)

然后我在运行Analyze时收到"潜在泄漏"警告.我能安全地忽略这个警告吗?或者,即使在属性定义中没有指定"retain",合成代码仍会执行隐式CGRetain吗?

Jos*_*erg 8

您要做的是向属性添加注释,该类型确实可以保留.

将属性声明更改为

@property (nonatomic, retain) CGImageRef image __attribute__((NSObject));
Run Code Online (Sandbox Code Playgroud)

请注意,这只会为您生成getter和setter,实例变量本身不受 ARC控制.具体来说,这意味着您必须将其释放dealloc,并且在直接分配给实例变量时需要使用正确的保留和释放.


更好的方法可能是使用typedef:

typedef CGImageRef CGImageObject __attribute__((NSObject));
@property (nonatomic, retain) CGImageObject image;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,实例变量是由ARC控制,所以你必须不释放它dealloc,并以实例变量直接分配是由ARC处理为好.


供参考,参见规范,特别是4.1.1节:

应用__attribute__((NSObject))不属于可保留对象指针类型的属性具有与ARC之外相同的行为:它要求属性类型为某种指针并允许使用除以外的修饰符assign.这些修饰符只影响合成的吸气剂和固定剂; 对ivar的直接访问(即使合成)仍然具有原始语义,并且在重新分配期间不会自动释放ivar中的值.

和第3节:

可保留对象指针(或"可保留指针")是可保持对象指针类型的值("可保留类型").有三种可保留的对象指针类型:

  • 块指针(通过将caret(^)声明符sigil应用于函数类型而形成)
  • Objective-C的对象的指针(id,Class,NSFoo*等)
  • typedef标有 __attribute__((NSObject))

  • CGImage绝对不会免费连接到UIImage.但是所有CFType都可以被视为NSObjects用于内存管理. (2认同)