NSMutableArray对象认为它是NSArray :(

rah*_*eel 0 iphone cocoa objective-c

所以我有一个房产NSMutableArray *grades.在我设置此属性的唯一地方,我这样做:

NSMutableArray *array = [[NSMutableArray alloc] init];
self.grades = array;    
[array release];
[self.grades addObject:@"20"];
Run Code Online (Sandbox Code Playgroud)

最后一个语句生成一个异常:-[NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'.

我错过了什么?

Chu*_*uck 8

听起来属性设置为copy,这意味着合成访问器生成数组的不可变副本


Anu*_*rag 6

确保grades是一个NSMutableArray.

编辑:

copy返回不可变副本,因此您无法进行更改.来自Apple的Objective-C文档:

复制

如果使用复制声明属性,则指定在分配期间复制值.如果合成相应的访问器,则合成方法使用复制方法.这对于诸如字符串对象之类的属性很有用,在这些属性中,setter中传递的新值可能是可变的(例如,NSMutableString的一个实例),并且您希望确保您的对象具有自己的私有不可变副本.例如,如果您声明属性如下:

虽然这适用于字符串,但如果属性是集合(如数组或集合),则可能会出现问题.通常,您希望此类集合是可变的,但copy方法返回集合的不可变版本.在这种情况下,您必须提供自己的setter方法实现,如以下示例所示.

在分配时复制整个集合是一项繁重的操作.你确定你不想retain收集,或只是assign它?

如果你真的想要一个可变副本,那么就像你建议的那样编写自己的setter.

- (void)setGrades:(NSMutableArray *)array {
    // make shallow/deep copy here, and assign to `grades`, not `self.grades`
}
Run Code Online (Sandbox Code Playgroud)