CGImageRef属性保留或不保留

时间:2011-11-28 14:32:23

标签: objective-c ios retain cgimageref

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

定义CGImageRef
@property (nonatomic, retain) CGImageRef image;

然后编译器抱怨这里不能使用“retain”。如果我省略保留,那么我假设使用“assign”,而我需要在设置属性时自行保留:

self.image = CGImageRetain ( cgimage );

然后在运行Analyze时出现“潜在泄漏”警告。我能安全地忽略这个警告吗?或者,即使在属性定义中没有指定“retain”,合成代码是否仍然执行隐式CGRetain?

2 个答案:

答案 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中的值   在解除分配期间不会自动释放。

section 3

  

可保留对象指针(或“可保留指针”)是a的值   可保留对象指针类型(“可保留类型”)。有三种   各种可保留的对象指针类型:

     
      
  • 阻止指针(通过将插入符号(^)声明符sigil应用于a   功能类型)
  •   
  • Objective-C对象指针(idClassNSFoo*等。)
  •   
  • 标有__attribute__((NSObject))
  • 的typedef   

答案 1 :(得分:-1)

这个怎么样?

@property (nonatomic, setter=setImage:) CGImageRef image;

(void)setImage:(CGImageRef)image {
    if (_image != image) {
        CGImageRelease(_image);
        _image = CGImageRetain(image);
    }
}