0

我有一个 NSMutableArray

@property (copy, nonatomic) NSMutableArray *childrenArray;

现在我像这样初始化它:

self.childrenArray = [NSMutableArray arrayWithArray:children];

上面的 children 也是 nsmutable 的,

现在,当我从子数组中删除一个对象时,我收到了这个错误:

[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent

我立即明白我的删除是在 NSArray 上调用的,所以我的查询是为什么我的访问器返回 NSArray,因为它应该返回 NSMutableArray。

谢谢,

4

1 回答 1

2

首先,copy@property 从字面上发送copy到正在设置的对象。可变集合copy通过创建不可变副本来响应。可变复制充斥着边缘情况(其中许多已经在其他 SO 问题中讨论过)。

其次,您真的希望属性提供对对象内可变状态的访问。而且您可能不想出售可变集合类。


钝:

发送copy到可变集合会返回不可变副本。copy属性不会保留可变性。

手动实现 setter/getter 来设置/返回可变实例可能是错误的。


这样想:

您有一个名为“Person”的类,它有一个名为“firstName”的属性。如果该属性是可变的,有人可能会说:

 [[aPerson firstName] setString:@"Joe"];

即,您是否希望某人能够更改您的名字而无需任何通知他们这样做了?可能不是。但这正是您通过在可变容器中公开对象状态所允许的。

于 2012-08-23T04:13:44.197 回答