1

假设我像这样声明一个属性

@property (nonatomic, copy) NSObject *property;

然后我创建一个自定义设置方法

- (void) setProperty:(NSObject *)property
{
    _property = property;

    // Some more code here
}

编译器是否解释了copy关键字,以便这个 setter 函数等价于这个?

_property = [property copy];

还是我有责任以这种方式编写它以使关键字与行为匹配?

4

1 回答 1

4

来自Clang/ARC 文档中的“4.1.1 属性声明” (强调添加):

  • copy意味着__strong所有权,以及 setter 上复制语义的通常行为。
  • ...

属性的指定所有权保留在其元数据中,但除非该属性是综合的,否则含义纯粹是传统的。如果一个属性是合成的,那么关联的实例变量是由@synthesize 声明可能隐含地命名的实例变量。如果关联的实例变量已经存在,则其所有权资格必须等于属性的所有权;否则,将使用该所有权资格创建实例变量。

因此,在您的情况下,使用自定义设置器,将属性声明为“副本”意味着关联的实例变量_property__strong但仅此而已。

设置器实际制作副本是您的责任,例如:

- (void) setProperty:(NSObject *)property
{
    _property = [property copy];
    // Some more code here
}
于 2014-05-22T19:04:41.060 回答