iphone - NSMutableArrays 的 NSMutableArray。发送到不可变对象(immutable对象)的变异方法

标签 iphone ios objective-c xcode cocoa

我有 NSMutableArraysNSMutableArrays:

 NSMutableArray *array = [[NSMutableArray alloc]init];

        for (int i = 0; i < 5; i++)
        {
            NSMutableArray *miniArray = [[NSMutableArray alloc]init];

            for (int k = 0; k < 30; k++)
            {   
                [miniArray addObject:@"0"];
            }
            [array addObject:miniArray];
        }

然后,当我尝试这样做时:

 [[array objectAtIndex:packIndex]replaceObjectAtIndex:index withObject:@"1"];

它崩溃了:[__NSCFArray replaceObjectAtIndex:withObject:]: mutating method sent to immutable object'

为什么?怎么修 ?谢谢!

更新: 我将这个数组保存在 NSUserDefaults 中:

[defaults setObject:array forKey:@"mainArray"];

然后,我在另一个类上看了:

array = [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"mainArray"]];

另外,我必须提一下,有时代码运行良好,它会将“0”更改为“1”。但它有时也会崩溃。所以我看不到逻辑,为什么它工作正常或者为什么有时会崩溃。

最佳答案

问题是当你从 NSUserDefaults 中读取数组时,迷你数组不会自动成为 NSMutableArrays。

试试这个:

array = [[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"mainArray"]];
for(int i = 0; i < array.count; i++) {
    NSArray * tempArray = array[i];
    array[i] = [tempArray mutableCopy];
}

编辑: Best Coder 的回答解释了为什么会这样。 存储在 NSUserDefaults 中的对象存储为不可变版本,基本上 NSUserDefaults 是一个 plist 并且没有标志将数组标记为可变/不可变,因此当您读回它们时,它们被假定为不可变。

关于iphone - NSMutableArrays 的 NSMutableArray。发送到不可变对象(immutable对象)的变异方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14840437/

相关文章:

iphone - 在 Objective-C 中执行一系列 SOAP 请求的更好方法

ios - 上下文菜单选择颜色和框架大小 Swift 5 iOS 13

ios - dataWithContentsOfMappedFile 在 iOS 8.0 中弃用

ios - 似乎无法隐藏我的 UIImageView

iphone - 有没有一种简单的方法可以让 UITableView 通过公开指示器突出显示用户选择了哪一行?

iphone - 从 ALAsset url iOS 获取视频 NSData

ios - 我陷入了初始化 UIView 子类的困境

ios - 使单元测试等待另一个方法中的异步调用

javascript - iOS 使用 UIWebView 使用 Math.pow 执行 JavaScript 字符串

php - Xcode 将带 url 的变量发送到 php 页面,为 select 语句检索 php 代码中的变量