Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c CGImageRef属性是否保留_Objective C_Ios_Retain_Cgimageref - Fatal编程技术网

Objective c 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时,我会收到一个“潜在泄漏”警告。我可以安全地忽略这个警告吗?或者,

我有一个关于如何将CGImageRef作为类的合成属性处理的问题。 如果我用

@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只是一个细微的区别。