Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFArray insertObject:atIndex:]: mutating method sent to immutable object'
错误意思是,把一个对象添加进了了一个不可变对象。。。。
我的理解是:把一个可变数组第一次存入 NSUserDefaults ,NSUserDefaults会转变为不可变的。。当你第二次往出取的时候,再用NSMutableArray得到,得到的实际是一个不可变的数组,即便是你用 NSMutableArray =得到的
NSData *udObject = [NSKeyedArchiver archivedDataWithRootObject:penLineDate];
self.saveDefaultsPaint addObject:udObject];//self.saveDefaultsPaint
就会报错,解决方法:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *savedPaintHistoryInfo = [userDefaults objectForKey: @"123"];
self.saveDefaultsPaint = [[NSMutableArray alloc] initWithArray:savedPaintHistoryInfo];
//不能直接 self.saveDefaultsPaint = savedPaintHistoryInfo 。。。在这里从 userDefaults中取得的 数据。实际是不可变的
-(void)getOldPaintContents
{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *savedPaintHistoryInfo = [userDefaults objectForKey: @"liuchao"];
self.saveDefaultsPaint = [[NSMutableArray alloc] initWithArray:savedPaintHistoryInfo];
// self.saveDefaultsPaint = [[[NSMutableArray alloc] init] autorelease];
// self.saveDefaultsPaint = savedPaintHistoryInfo;
for (NSData *penDate1 in self.saveDefaultsPaint)
{
RBCorePenLineDate *penDate = [[RBCorePenLineDate alloc] init];
penDate = [NSKeyedUnarchiver unarchiveObjectWithData:penDate1] ;
//判断当前是否是橡皮绘制
if([penDate.penOrEraser intValue] == 1) {
glBlendFunc(GL_ONE, GL_ZERO);
[self setBrushColorWithRed:0.0 green:0.0 blue:0.0 alpha:0.0];
[self setPaintSize:3.0];
}
if([penDate.penOrEraser intValue] == 0) {
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
[self setBrushColorWithRed:[[penDate.penColor objectAtIndex:0] floatValue] green:[[penDate.penColor objectAtIndex:1] floatValue] blue:[[penDate.penColor objectAtIndex:2] floatValue] alpha:[[penDate.penColor objectAtIndex:3] floatValue]];
[self setPaintSize:[penDate.penSize floatValue]];
}
NSUInteger count = penDate.pointDate.length / (sizeof(GL_FLOAT) * 2);
glVertexPointer(2, GL_FLOAT, 0, penDate.pointDate.bytes);
glDrawArrays(GL_POINTS, 0, count);
}
//显示
glBindRenderbufferOES(GL_RENDERBUFFER_OES, glRenderbuffer);
[glContext presentRenderbuffer:GL_RENDERBUFFER_OES];
// [self.saveDefaultsPaint release];
}
错误类似:
http://stackoverflow.com/questions/5346395/insert-object-in-an-nsmutablearray-saved-with-nsuserdefaults