JAA*_*JAA 17 iphone nsuserdefaults nsmutablearray
我有NSUserDefaults保存的NSMutableArray.这个数组是我用户可以保存的"最喜欢的"项目,所以当我想添加一个项目时,我需要读取数组(来自NSuserDefault)并保存在第一个空闲位置.
我正在使用此方法在NSMutableArray中添加值
-(IBAction)save{
NSMutableArray *abc = [[NSUserDefaults standardUserDefaults] objectForKey:@"12345"];
int n = [abc count];
[abc insertObject:@"aaa" atIndex:n];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[[NSUserDefaults standardUserDefaults] setObject:abc forKey:@"12345"];
[defaults synchronize];
[abc release];
}
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?如果用户调用此方法两次,则第二次应用程序崩溃时会显示以下日志:
*由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:' - [__ NSCFArray insertObject:atIndex:]:发送到immutable对象的mutating方法'
为什么?为什么只是第二次?第一次工作正常!
lxt*_*lxt 35
NSUserDefaults
始终返回不可变对象,即使原始对象是可变的.它在以下文档中objectForKey
:
返回的对象是不可变的,即使您最初设置的值是可变的.
在修改之前,您需要使用创建返回对象的副本 [NSMutableArray arrayWithArray:]
如果您正在检索数组,也可能最好使用该arrayForKey
方法NSUserDefaults
.文档:https://developer.apple.com/documentation/foundation/userdefaults
这是一个完整的工作示例:
- (void)saveScore:(NSNumber *)score
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableArray *scoreList = [[NSMutableArray alloc] initWithArray: [defaults objectForKey:@"ScoreList"]];
[scoreList addObject:score];
[defaults setObject:scoreList forKey:@"ScoreList"];
[defaults synchronize];
}
Run Code Online (Sandbox Code Playgroud)
首先,我们在可变数组中读取存储的数据,更新数组,保存新数组,然后同步用户默认值以永久记录更改.
希望这可以帮助!
归档时间: |
|
查看次数: |
15424 次 |
最近记录: |