关于 NSUserDefaults 报错

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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值