3

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

@property (nonatomic, retain) CGImageRef image;

然后编译器抱怨这里不能使用“保留”。如果我省略了保留,那么我假设使用“分配”,并且在设置属性时我需要自己进行保留:

self.image = CGImageRetain ( cgimage );

然后我在运行分析时收到“潜在泄漏”警告。我可以放心地忽略此警告吗?或者,即使在属性定义中没有指定“保留”,合成代码是否仍然执行隐式 CGRetain?

4

3 回答 3

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 处理。


作为参考,请参阅规范,特别是第 4.1.1 节

应用于__attribute__((NSObject))非可保留对象指针类型的属性与在 ARC 之外的行为相同:它要求属性类型是某种指针并允许使用除assign. 这些修饰符只影响合成的 getter 和 setter;对 ivar 的直接访问(即使是合成的)仍然具有原始语义,并且 ivar 中的值不会在释放期间自动释放。

第 3 节

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

  • 块指针(通过将插入符号 ( ^) 声明符符号应用于函数类型而形成)
  • Objective-C 对象指针(id, Class,NSFoo*等)
  • typedef 标记为__attribute__((NSObject))
于 2011-11-28T14:42:14.877 回答
1

我不喜欢在编译时指示编译器。我觉得很丑 我会自己覆盖这些方法。

@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
于 2011-11-28T16:39:57.073 回答
-1

这个怎么样?

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

(void)setImage:(CGImageRef)image {
    if (_image != image) {
        CGImageRelease(_image);
        _image = CGImageRetain(image);
    }
}
于 2018-02-27T23:59:30.320 回答