使用可变数组检索保存到NSUserDefaults并更改值的数组

时间:2013-12-02 03:14:28

标签: cocoa nsuserdefaults mutability

NSUserDefaults返回的值是不可变的,即使您将可变对象设置为值也是如此。

有一个问题让我困惑。

我使用NSArraysetObject: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)

1 个答案:

答案 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:方法,则同步不保存更改。顺便说一句,只有当你想要在退出应用程序等时确保保存首选项时,你不需要手动调用同步。