如果将属性定义为副本,在分配给ivar时是否仍需要复制?

时间:2016-09-26 00:24:36

标签: objective-c automatic-ref-counting declared-property

假设我有一个定义为@property (copy) NSString *name的属性。

假设我的init方法定义如下。

-(instancetype) initWithName:(NSString *)name
{
   self = [super init];
   if (self)
   {
      _name = [name copy]; //Do I need this copy or will ARC do it automatically?
   }
   return self;
}

我是否需要注释行中的副本,或者ARC是否会根据属性声明中的copy处理它,就像在合成的setter中一样?

1 个答案:

答案 0 :(得分:5)

copy适用于属性的合成setter方法,而不是后备实例变量。

由于您绕过initWithName:方法中的属性并直接分配给实例变量,因此copy不会自动应用。

为了遵守复制值的合同,当您直接为实例变量赋值时,应该显式调用copy。这些都与ARC(或MRC)无关。这完全取决于您在物业上定义的合同。

tl; dr - 是的,您应该在发布的代码中致电copy