我有一个NSMutableArray
@property (copy, nonatomic) NSMutableArray *childrenArray;
现在我将它初始化为:
self.childrenArray = [NSMutableArray arrayWithArray:children];
孩子也是上面的,
现在当我从children数组中删除一个对象时,我收到了这个错误:
[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent
我立即明白我的删除是在NSArray上调用的,所以我的查询是我的访问者返回NSArray的原因,因为它应该返回NSMutableArray。
谢谢,
答案 0 :(得分:2)
首先,copy
@property将copy
字面发送给正在设置的对象。可变集合通过创建不可变副本来响应copy
。可变复制充斥着边缘情况(其他SO问题已经涉及很多)。
其次,您确实确实不希望属性提供对象内可变状态的访问权限。你可能不想出售可变的集合类。
钝:
向可变集合发送copy
将返回不可变副本。 copy
属性不会保留可变性。
手动实现setter / getter来设置/返回可变实例可能是错误的。
这样想:
您有一个名为“Person”的类,它具有名为“firstName”的属性。如果该属性是可变的,有人可能会说:
[[aPerson firstName] setString:@"Joe"];
即。你想让某人能够改变你的名字,而没有他们这样做的任何通知吗?可能不是。但是,通过在可变容器中公开对象的状态,完全是允许的。