copy
@property (nonatomic, copy) NSArray *immutableArray;
当 property 使用 copy 来修饰时,在 setter 方法里会调用新值的 -copy 方法产生一个不可变的对象,再用这个对象进行赋值。
于是就有了使用 copy 时要注意的点:
- 必须遵守 NSCopying 协议;
- 一般用在不可变集合类上:
如:
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:@[@1, @2, @3]];
self.immutableArray = mutableArray;
[mutableArray removeAllObjects];
这时即使可变数组清空了所有对象,self.immutableArray 的内容也不会改变,
因为此时这两个数组指向的已不是同一个对象,这就是 copy 的作用。
此处换成 strong 就没有这个效果了。
所以,使用 copy 能避免可变集合(如:mutableArray)给不可变集合(如:self.immutableArray)赋值时可能产生的错误,毕竟我们希望 self.immutableArray 的内容能够保持不变,而 mutableArray 在赋值完成后有可能会做一些内容的更改,自然就不能让他们指向同一个对象了。
再有,直接通过该属性对应的实例变量来赋值的话,copy 是不起作用的:
_immutableArray = mutableArray; // 这时这两个数组指向的仍然是同一个对象
网友评论