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'
.
我错过了什么?
确保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)