[英]CGImageRef property retain or not retain
我有一个关于如何处理CGImageRef作为类的综合属性的问题。 如果我定义CGImageRef
@property (nonatomic, retain) CGImageRef image;
然后编译器抱怨这里不能使用“retain”。 如果我省略保留,那么我假设使用“assign”,我需要在设置属性时自行保留:
self.image = CGImageRetain ( cgimage );
然后我在运行Analyze时收到“潜在泄漏”警告。 我能安全地忽略这个警告吗? 或者,即使在属性定义中没有指定“retain”,合成代码仍会执行隐式CGRetain吗?
您要做的是向属性添加注释,该类型确实可以保留。
将属性声明更改为
@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处理为好。
将
__attribute__((NSObject))
应用于不属于可保留对象指针类型的属性具有与ARC之外相同的行为:它要求属性类型为某种指针并允许使用除assign
之外的修饰符。 这些修饰符只影响合成的吸气剂和固定剂; 对ivar的直接访问(即使合成)仍然具有原始语义,并且在重新分配期间不会自动释放ivar中的值。
第3节 :
可保留对象指针(或“可保留指针”)是可保持对象指针类型的值(“可保留类型”)。 有三种可保留的对象指针类型:
- 块指针(通过将插入符号(
^
)声明符sigil应用于函数类型而形成)- Objective-C对象指针(
id
,Class
,NSFoo*
等)- typedef标有
__attribute__((NSObject))
我不喜欢在编译时指示编译器。 我认为这很难看。 我自己覆盖了这些方法。
@interface MyClass : NSObject {
CGImageRef _image;
}
@property (nonatomic, assign) CGImageRef image;
@end
@implementation MyClass
- (void)setImage:(CGImageRef)i {
if(_image != i) {
CGImageRelease(_image);
_image = CGImageRetain(i);
}
}
- (CGImageRef)image {
return _image;
}
@end
这个怎么样?
@property (nonatomic, setter=setImage:) CGImageRef image;
(void)setImage:(CGImageRef)image {
if (_image != image) {
CGImageRelease(_image);
_image = CGImageRetain(image);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.