简述这个写法会出什么问题:@property (nonatomic, copy) NSMutableArray *arr; ?
参考答案:
在 Objective-C 中,使用 @property 声明一个属性时,指定 copy 属性意味着当为这个属性赋值时,会调用赋值对象的 copy 方法来创建一个新的副本,并将这个副本赋值给属性,而不是直接使用原来的对象。这通常用于不可变对象(如 NSString、NSArray、NSDictionary 等),以避免在外部修改这些对象时影响内部的状态。
但是,当你对 NSMutableArray 使用 copy 属性时,会出现以下问题:
- 类型不匹配:
NSMutableArray的copy方法返回的是一个不可变的NSArray对象,而不是NSMutableArray。因此,如果你尝试修改这个copy后的数组,程序会在运行时崩溃,因为NSArray不允许修改。 - 语义错误:
NSMutableArray意味着这个数组是可以被修改的。使用copy属性与这种可变性相矛盾,因为copy属性的语义是创建一个不可变的副本。 - 性能问题:即使你确实想要一个不可变的数组,每次赋值都调用
copy方法也会带来额外的性能开销,因为需要创建新的对象。
正确的做法应该是使用 strong 属性来持有 NSMutableArray,这样可以确保对数组的直接引用,并且允许对其进行修改:
@property (nonatomic, strong) NSMutableArray *arr;
这样,你就可以安全地修改 arr 属性指向的 NSMutableArray 实例了。