保留的核心基础属性

(Xcode 4.2,iOS 5, ARC

我有一些Core Foundation(/ Graphics)对象的属性,它们应该拥有对象的所有权。 现在在这些苹果文档中,我发现这个:

在OS X v10.6和更高版本中,可以使用__attribute__关键字来指定Core Foundation属性应该像内存pipe理的Objective-C对象一样对待: @property(retain) __attribute__((NSObject)) CFDictionaryRef myDictionary;

不幸的是我找不到任何细节。 我正在使用这个:

@property (nonatomic, strong) __attribute__((NSObject)) CGImageRef loupeImage;

而且它似乎以我期望的方式工作。 它将保留设置属性的对象,并在将属性设置为nil时释放它。

现在我的问题是,我仍然需要明确地设置这些属性为零在我dealloc?

编辑:我以前的post是不正确的。 属性上的__attribute__((NSObject))只会导致它在使用属性访问器时保留/释放属性。 这并不影响对伊娃的使用权,尤其是,它并没有删除(或释放) dealloc的财产。 所以是的,在你dealloc你要么说self.loupeImage = nil; 或者你需要说[_loupeImage release]


原文:

如果编译器接受strong关键字,那么它会正确处理它,保留并按预期方式释放,并在ARC中自动排除。 __attribute__((NSObject))的整个思想是告诉编译器把这个对象看作是一个obj-c对象,这就是它的作用。

所以不,你不应该在dealloc中明确地将它们清零。 您将自动获得默认的ARC / NILL / ARC释放行为。

现在我的问题是,我仍然需要明确地设置这些属性为零在我dealloc?

是的 ,你这样做了,就是你所展示的声明。

在ARC规范的属性声明部分 ,它说:

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

(强调我最后join的部分)

换句话说,对Core基types的属性应用__attribute__((NSObject))strong会使得getters和setter正常工作,但不会使ARCpipe理基础实例variables(因为实例variables的types仍然是Core基础types),因此ARC不会在dealloc释放实例variables,如果它不为零。 有了这样的财产声明,你将不得不在dealloc或导致泄漏。

但是,有一种方法可以让ARCpipe理variables本身。 由于variables具有Core基础types,因此可以通过将其封装在带有__attribute__((NSObject))typedef使其成为ARCpipe理的types。

ARC规范的可维护对象指针部分说:

有三种可保留的对象指针types:

  • 块指针(通过将脱字号( ^ )声明符sigil应用于函数types而形成)
  • Objective-C对象指针( idClassNSFoo*等)
  • __attribute__((NSObject))标记的__attribute__((NSObject))

(强调我最后join的项目)

所以如果你这样做一个typedef:

 typedef __attribute__((NSObject)) CGImageRef MyImageRef; 

并声明你的财产是这样的:

 @property (nonatomic, strong) MyImageRef loupeImage; 

底层variables将由ARCpipe理(因为底层variables将具有typedeftypes,这是一个ARCpipe理的types),您不必在dealloc中将其dealloc