2012-07-12 37 views
1

根据ARC, 如果我定义了一个伊娃这样的:根据ARC,财产和Objective-C的声明混淆

@interface ObjectA : NSObject { 
    id A; 
} 

@property(nonatomic,unsafe_unretained) id A; 

什么是财产?强或不安全?

+0

你刚刚设置了“unsafe_unretained” – 2012-07-12 03:35:03

+0

我很少使用gtalk。如果你有QQ,你可以添加50602724. – 2012-07-12 05:08:17

回答

2

这取决于您如何实现它。有两种方法可以去这样做:

  • 使用@synthesize A;@synthesize A = __A;在这种情况下,它__unsafe_unretained,因为财产的所有权规格胜过伊娃的所有权规范。
  • 手动编写AsetA。在这种情况下,结果将取决于您为实现选择的备份变量的种类。

这里是一个link于阐述了如何属性的所有权被确定的规则的文档。参见第4.1.1节。

如果相关联的实例变量已经存在,那么它的所有权资格必须等于资产的所有权;否则,该实例变量是通过该[所有权]的所有权限定来创建的。

属性的指定所有权被保留在其元数据中,否则其含义是纯常规的,除非属性被合成。

+0

我很感兴趣...你有文档链接吗? – 2012-07-12 03:44:06

+0

Msing - >使用? – 2012-07-12 03:45:23

+0

@luyuan是的,谢谢你的纠正。 – dasblinkenlight 2012-07-12 03:52:26

0

从苹果DOC:

可变预选赛

您使用以下一生预选赛变量,就像你,说,常量。

__strong 
__weak 
__unsafe_unretained 
__autoreleasing 

__strong是默认值。只要有一个强有力的指针,一个对象就保持“活着”。 __weak指定了一个引用,该引用不保留被引用对象的活动状态。当没有强引用时,弱引用设置为零。 __unsafe_unretained指定一个引用,该引用不会使引用的对象保持活动状态,并且在没有对该对象的强引用时不会将其设置为nil。如果它所引用的对象被解除分配,指针就会悬空。 __autoreleasing用于表示通过引用(id *)传递的参数,并在返回时自动释放。 你应该正确地修饰变量。在对象变量声明中使用限定符时,正确的格式为: