gpt4 book ai didi

objective-c - CGImageRef 属性保留或不保留

转载 作者:可可西里 更新时间:2023-11-01 17:02:07 26 4
gpt4 key购买 nike

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

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

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

self.image = CGImageRetain ( cgimage );

然后我在运行 Analyze 时收到“潜在泄漏”警告。我可以安全地忽略此警告吗?或者即使在属性定义中没有指定“保留”,合成代码是否仍然执行隐式 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 处理。


有关引用,请参阅 specification , 具体来说 section 4.1.1 :

Applying __attribute__((NSObject)) to a property not of retainable object pointer type has the same behavior it does outside of ARC: it requires the property type to be some sort of pointer and permits the use of modifiers other than assign. These modifiers only affect the synthesized getter and setter; direct accesses to the ivar (even if synthesized) still have primitive semantics, and the value in the ivar will not be automatically released during deallocation.

section 3 :

A retainable object pointer (or “retainable pointer”) is a value of a retainable object pointer type (“retainable type”). There are three kinds of retainable object pointer types:

  • block pointers (formed by applying the caret (^) declarator sigil to a function type)
  • Objective-C object pointers (id, Class, NSFoo*, etc.)
  • typedefs marked with __attribute__((NSObject))

关于objective-c - CGImageRef 属性保留或不保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8297373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com