在ARC下,Objective-C的属性和声明混淆了

时间:2012-07-12 03:28:40

标签: objective-c ios automatic-ref-counting

在ARC下, 如果我定义这样的ivar:

@interface ObjectA : NSObject {
    id A;
}

@property(nonatomic,unsafe_unretained) id A;

A的属性是什么?强或不安全的?

2 个答案:

答案 0 :(得分:2)

这取决于你如何实现它。你有两种方法可以做到这一点:

  • 使用@synthesize A;@synthesize A = __A;在这种情况下,它是__unsafe_unretained,因为该属性的所有权规范胜过了ivar 1 的所有权规范。
  • 手写AsetA。在这种情况下,结果将取决于您为实现选择的支持变量的类型。 2

以下是文档的link,其中详细说明了如何确定属性所有权的规则。见4.1.1节。

  

1 如果关联的实例变量已存在,则其所有权限定必须等于该属性的所有权;否则,实例变量是使用[属性]的所有权限定创建的。

     

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

答案 1 :(得分:0)

来自apple doc:

可变限定符

对变量使用以下生命周期限定符,就像使用const。

一样
__strong
__weak
__unsafe_unretained
__autoreleasing

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