Property Attribute

2016-04-26  本文已影响0人  KGBer

copy

@property (nonatomic, copy) NSArray *immutableArray;

当 property 使用 copy 来修饰时,在 setter 方法里会调用新值的 -copy 方法产生一个不可变的对象,再用这个对象进行赋值。
于是就有了使用 copy 时要注意的点:

  1. 必须遵守 NSCopying 协议;
  2. 一般用在不可变集合类上:
    如:
    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; // 这时这两个数组指向的仍然是同一个对象

上一篇下一篇

猜你喜欢

热点阅读