从NSUserDefaults
返回的值是不可变的,即使您将可变对象设置为值也是如此。
有一个问题让我困惑。
我使用NSArray
将setObject:forKey:
(不可变)保存到用户默认值中,然后进行同步。
我删除了保存代码,并使用NSMutableArray
通过objectForKey:
我对可变数组做了一些可变操作。我使用[[userDefaults standardUserDefaults] objectForKey:]
来检索数组,并且我的操作改变了它,并且我进行了同步。
但是当我再次运行程序时,数组不会改变!
我可以使用mutable类来接收不可变类吗?它可以更改,并且显示在内存中,并且从用户默认值恢复的值也已更改。我不知道为什么。我同步了,但是plist文件没有改变。我不知道为什么。
代码:
//NSLog(@"Hello, World!");
NSUserDefaults *ud = [NSUserDefaults standardUserDefaults];
//NSArray *arr = @[@"1",@"2"];
//[ud setObject:arr forKey:@"arr"];
//[ud synchronize];
NSMutableArray *arr = [ud objectForKey:@"arr"];
NSLog(@"before %@",arr);
NSLog(@"%@",[arr class]);
[arr isKindOfClass:[NSMutableArray class]];
[arr removeObjectAtIndex:0];
NSLog(@"after %@",arr);
BOOL ans = [ud synchronize];
NSArray *arr2 = [ud objectForKey:@"arr"];
NSLog(@"retrieve from ud %@",arr2);
控制台:
2013-12-02 11:42:46.791 NSUserDefaultsDemo[24447:303] before (
1,
2)
2013-12-02 11:42:46.792 NSUserDefaultsDemo[24447:303] __NSArrayM
2013-12-02 11:42:46.792 NSUserDefaultsDemo[24447:303] after (
2)
2013-12-02 11:42:46.793 NSUserDefaultsDemo[24447:303] retrieve from ud (
2)
答案 0 :(得分:1)
您没有像我想的那样将更改保存到NSUserDefaults。
此代码有效:
NSArray *arr = @[@"Object 1", @"Object 2"];
[[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"testArr"];
NSMutableArray *mArr = [NSMutableArray arrayWithArray:[[NSUserDefaults standardUserDefaults] objectForKey:@"testArr"]];
[mArr removeObjectAtIndex:0];
[[NSUserDefaults standardUserDefaults] setObject:mArr forKey:@"testArr"];
如果不首先使用setObject:forKey:方法,则同步不保存更改。顺便说一句,只有当你想要在退出应用程序等时确保保存首选项时,你不需要手动调用同步。