假设我声明了一个像这样的属性
@property (nonatomic, copy) NSObject *property;
然后我创建一个自定义setter方法
- (void) setProperty:(NSObject *)property
{
_property = property;
// Some more code here
}
编译器是否解释copy
关键字,以便此setter函数与此相同?
_property = [property copy];
或者我有责任以这种方式编写它以使关键字符合行为吗?
答案 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
}