简述这个写法会出什么问题:@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
实例了。