1

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

@interface ObjectA : NSObject {
    id A;
}

@property(nonatomic,unsafe_unretained) id A;

A的属性是什么?强还是 unsafe_unretained?

4

2 回答 2

2

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

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

这是一个文档链接,其中阐明了如何确定财产所有权的规则。请参阅第 4.1.1 节。

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

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

于 2012-07-12T03:39:55.790 回答
0

来自苹果文档:

变量限定符

您可以像使用 const 一样对变量使用以下生命周期限定符。

__strong
__weak
__unsafe_unretained
__autoreleasing

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

于 2012-07-12T03:39:39.247 回答