如果一个属性定义为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
。
假设我有一个 属性 定义为 @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
。