跳到主要内容

简述这个写法会出什么问题:@property (nonatomic, copy) NSMutableArray *arr; ?

参考答案:

在 Objective-C 中,使用 @property 声明一个属性时,指定 copy 属性意味着当为这个属性赋值时,会调用赋值对象的 copy 方法来创建一个新的副本,并将这个副本赋值给属性,而不是直接使用原来的对象。这通常用于不可变对象(如 NSStringNSArrayNSDictionary 等),以避免在外部修改这些对象时影响内部的状态。

但是,当你对 NSMutableArray 使用 copy 属性时,会出现以下问题:

  1. 类型不匹配NSMutableArraycopy 方法返回的是一个不可变的 NSArray 对象,而不是 NSMutableArray。因此,如果你尝试修改这个 copy 后的数组,程序会在运行时崩溃,因为 NSArray 不允许修改。
  2. 语义错误NSMutableArray 意味着这个数组是可以被修改的。使用 copy 属性与这种可变性相矛盾,因为 copy 属性的语义是创建一个不可变的副本。
  3. 性能问题:即使你确实想要一个不可变的数组,每次赋值都调用 copy 方法也会带来额外的性能开销,因为需要创建新的对象。

正确的做法应该是使用 strong 属性来持有 NSMutableArray,这样可以确保对数组的直接引用,并且允许对其进行修改:

@property (nonatomic, strong) NSMutableArray *arr;

这样,你就可以安全地修改 arr 属性指向的 NSMutableArray 实例了。