如果一个属性定义为copy,我赋值给ivar时还需要做copy吗?

If a property is defined as copy, do I still need to do a copy when assigning to the ivar?

假设我有一个 属性 定义为 @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 中一样?

copy 适用于 属性 的综合 setter 方法,而不是支持实例变量。

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

为了遵守复制值的契约,当你直接给实例变量赋值时,你应该显式地调用copy。 None 其中与 ARC(或 MRC)有关。这都是关于您在 属性.

上定义的合同

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