kus*_*uya 1 objective-c nsuserdefaults nsmutablearray nsmutabledictionary ios
我想从NSUserDefaults更改对象get.
但是在执行以下代码时,应用程序崩溃并显示错误消息:
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object’
Run Code Online (Sandbox Code Playgroud)
我有这个代码.
NSUserDefaults* pref = [NSUserDefaults standardUserDefaults];
NSMutableArray* data = [[NSMutableArray alloc]init];
data = [[pref objectForKey:@"Data"] mutableCopy];
for (NSArray* array in data) { //make object mutable
[array mutableCopy];
for (NSDictionary* dic in array) {
[dic mutableCopy];
}
}
[data[0][1] setObject:@"YES" forKey:@"isChecked"]; //for example
[pref setObject: data forKey: @"Data"];
[pref synchronize];
Run Code Online (Sandbox Code Playgroud)
数据结构:
NSMutableArray* arr1 = [@[[@{@"name":@"abc", @"isChecked":@"YES"} mutableCopy], [@{@"name":@"def", @"isChecked":@"NO"} mutableCopy]] mutableCopy];
NSMutableArray* arr2 = [@[[@{@"name":@"ghi", @"isChecked":@"NO"} mutableCopy], [@{@"name":@"jkl", @"isChecked":@"YES"} mutableCopy]] mutableCopy];
NSMutableArray* data = [@[arr1, arr2] mutableCopy];
[userDefaults setObject: data forKey: @"Data"];
Run Code Online (Sandbox Code Playgroud)
如何修复它以更改对象NSArray
或NSDictionary
从中获取对象NSUserDefaults
?
你有正确的想法 - 返回的对象NSUserDefaults
是不可变的,你需要mutableCopy
用来获得一个可变的副本.但是,您的实施存在缺陷.
mutableCopy
返回一个新的,可变的对象副本.它不会使现有对象变得可变.您只是忽略了您正在创建的可变副本.
由于您希望改变数组中的数据,因此无法使用枚举,或者在枚举时会出现对象被突变的错误,因此您需要通过索引访问数组 -
NSUserDefaults* pref = [NSUserDefaults standardUserDefaults];
NSMutableArray* data = [[pref objectForKey:@"Data"] mutableCopy];
for (int i=0;i<data.count;i++) {
NSMutableArray *mArray = [data[i] mutableCopy];
for (int j=0;j<mArray.count;j++) {
NSMutableDictionary *mDictionary=[mArray[j] mutableCopy];
mDictionary[@"SomeKey"]=@"SomeValue";
mArray[j]=mDictionary;
}
data[i]=mArray;
}
[userDefaults setObject: data forKey: @"Data"];
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
711 次 |
最近记录: |