我有一个关于如何将CGImageRef作为类的合成属性处理的问题。 如果我用
定义CGImageRef@property (nonatomic, retain) CGImageRef image;
然后编译器抱怨这里不能使用“retain”。如果我省略保留,那么我假设使用“assign”,而我需要在设置属性时自行保留:
self.image = CGImageRetain ( cgimage );
然后在运行Analyze时出现“潜在泄漏”警告。我能安全地忽略这个警告吗?或者,即使在属性定义中没有指定“retain”,合成代码是否仍然执行隐式CGRetain?
答案 0 :(得分:8)
您要做的是向属性添加注释,以确保可以保留该类型。
将属性声明更改为
@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处理。
供参考,请参阅specification,具体为section 4.1.1:
将
__attribute__((NSObject))
应用于不可保留的属性 对象指针类型与ARC之外的行为相同:它 要求属性类型是某种指针并允许 使用assign
以外的修饰符。这些修饰符只影响 合成吸气剂和定位剂;直接进入伊达(即使 合成的)仍然具有原始语义,以及ivar中的值 在解除分配期间不会自动释放。
可保留对象指针(或“可保留指针”)是a的值 可保留对象指针类型(“可保留类型”)。有三种 各种可保留的对象指针类型:
- 阻止指针(通过将插入符号(
^
)声明符sigil应用于a 功能类型)- Objective-C对象指针(
id
,Class
,NSFoo*
等。)- 标有
的typedef__attribute__((NSObject))
答案 1 :(得分:-1)
这个怎么样?
@property (nonatomic, setter=setImage:) CGImageRef image;
(void)setImage:(CGImageRef)image {
if (_image != image) {
CGImageRelease(_image);
_image = CGImageRetain(image);
}
}