0

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

有一个问题让我感到困惑。

我将一个NSArray(不可变的)保存到用户默认值中setObject:forKey:,然后同步。

我删除了保存代码,并使用 anNSMutableArray来获取我保存的值,通过objectForKey:

我对可变数组做了一些可变操作。我[[userDefaults standardUserDefaults] objectForKey:]用来检索数组,它被我的操作改变了,我同步了。

但是当我再次运行程序时,数组并没有改变!

我可以使用可变类来接收不可变类吗?它可以更改,并出现在内存中,并且从用户默认值中检索的值也已更改。我不知道为什么。我同步了,但是 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)
4

1 回答 1

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

于 2013-12-02T04:23:20.217 回答