Objective c CGImageRef属性是否保留
我有一个关于如何将CGImageRef作为类的合成属性处理的问题。 如果我用Objective c CGImageRef属性是否保留,objective-c,ios,retain,cgimageref,Objective C,Ios,Retain,Cgimageref,我有一个关于如何将CGImageRef作为类的合成属性处理的问题。 如果我用 @property (nonatomic, retain) CGImageRef image; 然后编译器抱怨这里不能使用“retain”。如果我省略了retain,那么我假设使用了“assign”,并且我需要在设置属性时自己执行retain: self.image = CGImageRetain ( cgimage ); 然后在运行Analyze时,我会收到一个“潜在泄漏”警告。我可以安全地忽略这个警告吗?或者,
@property (nonatomic, retain) CGImageRef image;
然后编译器抱怨这里不能使用“retain”。如果我省略了retain,那么我假设使用了“assign”,并且我需要在设置属性时自己执行retain:
self.image = CGImageRetain ( cgimage );
然后在运行Analyze时,我会收到一个“潜在泄漏”警告。我可以安全地忽略这个警告吗?或者,即使在属性定义中没有指定“retain”,合成代码是否仍执行隐式CGRetain?您要做的是向属性添加一个注释,说明该类型确实可以保留 将属性声明更改为
@property (nonatomic, retain) CGImageRef image __attribute__((NSObject));
请注意,这将只为您生成getter和setter,实例变量本身是不受控制的。具体来说,这意味着您必须在dealloc
中释放它,并且在直接分配给实例变量时需要使用适当的retain和release
更好的方法可能是使用
typedef
:
typedef CGImageRef CGImageObject __attribute__((NSObject));
@property (nonatomic, retain) CGImageObject image;
在这种情况下,实例变量由ARC控制,因此您必须不要在dealloc
中释放它,并且对实例变量的直接赋值也由ARC处理
有关参考,请参见,具体如下: 将
\uuuuuuuuuuuuuu属性((NSObject))
应用于不可保留的属性
对象指针类型与它在弧外的行为相同:它
要求属性类型是某种指针,并允许
使用除赋值
以外的修饰符。这些修改器仅影响
合成吸气剂和沉降剂;直接访问ivar(即使
合成)仍然具有原始语义,并且ivar中的值
在解除分配期间不会自动释放
以及:
可保留对象指针(或“可保留指针”)是
可保留对象指针类型(“可保留类型”)。有三个
可保留对象指针类型的种类:
- 块指针(通过将插入符号(
)声明符sigil应用于 功能类型)^
- Objective-C对象指针(
,id
,Class
,等等)NSFoo*
- 用
\uuuuu属性((NSObject))标记的typedefs
我不喜欢在编译时指导编译器。我觉得很难看。我会自己重写这些方法
@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);
}
}
谢谢你的快速回复,约书亚。这确实有效,但并不漂亮。我假设它指示编译器将属性作为NSObject@fishinear:它并不漂亮,因为
CGImageRef
不是NSObject,而您坚持将其视为一个对象。当然,这很好,因为它是免费桥接到UIImage类型的。但是这种语言的语法不能让你毫发无伤地逃脱。因此,无论是使用明确的基础保留,演员,或财产装饰。CG映像绝对不是免费的桥接到UIImage。但所有CFTYPE都可以作为NSObjects进行内存管理。是的,这就是我的意思。;)以下是所有具有免费桥接的对象的列表(CGImageRef不在其中):您对丑陋与不丑陋有一个有趣的想法:)本例中的属性正在破坏您指定的自己的契约。它根本不是赋值属性。你在破坏工具,我同意约书亚的观点。另外,我喜欢“综合”这个概念,我不需要考虑像这样基本的东西。@Joshua,你对丑陋事物的看法可能是对的。将某物声明为assign,然后将其实现为retain是不正确的。对于完全不使用属性,而只是在接口中指定setter和getter方法,您有何想法?在当今时代,我不确定您为什么不定义属性并让运行时做正确的事情。作为开发人员,您所做的只是指示编译器。您键入的每一行都指示编译器某些内容。向声明中添加属性与添加extern、static、__block、volatile等没有什么不同。这与@v1Axvw的答案几乎相同,他6年后的结果。你认为这个答案增加了什么?@fish指定setter只是一个细微的区别。