在实现自定义访问器方法时是否覆盖了声明的属性属性?

时间:2014-05-22 18:50:11

标签: objective-c memory-management declared-property

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

@property (nonatomic, copy) NSObject *property;

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

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

    // Some more code here
}

编译器是否解释copy关键字,以便此setter函数与此相同?

_property = [property copy];

或者我有责任以这种方式编写它以使关键字符合行为吗?

1 个答案:

答案 0 :(得分:4)

Clang/ARC documentation中的“4.1.1属性声明” (重点补充):

  
      
  • copy隐含__strong所有权,以及setter上复制语义的常规行为。
  •   
  • ...
  •   
     

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

因此,在您的情况下,使用自定义setter,将属性声明为“copy”意味着关联 实例变量_property__strong,但没有别的。

你的责任是设定者实际制作副本,例如:

- (void) setProperty:(NSObject *)property
{
    _property = [property copy];
    // Some more code here
}