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吗?
您要做的是向属性添加注释,该类型确实可以保留.
将属性声明更改为
@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处理为好.
应用
__attribute__((NSObject))不属于可保留对象指针类型的属性具有与ARC之外相同的行为:它要求属性类型为某种指针并允许使用除以外的修饰符assign.这些修饰符只影响合成的吸气剂和固定剂; 对ivar的直接访问(即使合成)仍然具有原始语义,并且在重新分配期间不会自动释放ivar中的值.
和第3节:
可保留对象指针(或"可保留指针")是可保持对象指针类型的值("可保留类型").有三种可保留的对象指针类型:
- 块指针(通过将caret(
^)声明符sigil应用于函数类型而形成)- Objective-C的对象的指针(
id,Class,NSFoo*等)- typedef标有
__attribute__((NSObject))
| 归档时间: |
|
| 查看次数: |
3383 次 |
| 最近记录: |