Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSUserDefaults:更新plist中的数据_Objective C_Macos_Cocoa - Fatal编程技术网

Objective c NSUserDefaults:更新plist中的数据

Objective c NSUserDefaults:更新plist中的数据,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我正在使用[NSUserDefaults standardUserDefaults]保存应用程序首选项,其中有几个项目,其中一个是一个充满字典的数组。我想删除该数组中的第一项,因此我尝试以下操作: [[[NSUserDefaults standardUserDefaults] objectForKey:accounts] removeObjectAtIndex:0]; 这会删除索引0处的数组项,但不会更新plist文件。但是,当我这样做的时候 [[NSUserDefaults standard

我正在使用
[NSUserDefaults standardUserDefaults]
保存应用程序首选项,其中有几个项目,其中一个是一个充满字典的数组。我想删除该数组中的第一项,因此我尝试以下操作:

[[[NSUserDefaults standardUserDefaults] objectForKey:accounts] removeObjectAtIndex:0];
这会删除索引0处的数组项,但不会更新plist文件。但是,当我这样做的时候

[[NSUserDefaults standardUserDefaults] removeObjectForKey:accounts];

它删除所有项并更新plist文件。为什么第一行不将数据保存到plist?

文档说明从
NSUserDefaults
返回的值是不可变的。我认为这意味着,如果您检索一个值(例如通过
objectForKey:
),然后修改该值,那么更改将不会保留到用户默认值。您需要自己通过
setObject:forKey:
保存更改

从NSUserDefaults返回的值是不可变的,即使将可变对象设置为值也是如此。例如,如果将可变字符串设置为“MyStringDefault”的值,则稍后使用stringForKey:检索的字符串将是不可变的

虽然这真的很奇怪,但下面的方法似乎奏效了。。。(但这种变化不会持续下去)


文档说明从
NSUserDefaults
返回的值是不可变的。我认为这意味着,如果您检索一个值(例如通过
objectForKey:
),然后修改该值,那么更改将不会保留到用户默认值。您需要自己通过
setObject:forKey:
保存更改

从NSUserDefaults返回的值是不可变的,即使将可变对象设置为值也是如此。例如,如果将可变字符串设置为“MyStringDefault”的值,则稍后使用stringForKey:检索的字符串将是不可变的

虽然这真的很奇怪,但下面的方法似乎奏效了。。。(但这种变化不会持续下去)

试试这个

NSMutableArray *Arr=(NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:@"YourKey"];
[Arr removeObjectAtIndex:0];
[[NSUserDefaults standardUserDefaults] setObject:Arr forKey:@"YourKey"];
试试这个

NSMutableArray *Arr=(NSMutableArray *)[[NSUserDefaults standardUserDefaults] objectForKey:@"YourKey"];
[Arr removeObjectAtIndex:0];
[[NSUserDefaults standardUserDefaults] setObject:Arr forKey:@"YourKey"];

下面是我发现的另一种避免启动阵列的解决方案:

//do whatever with [NSUserDefaults standardUserDefaults]
[[NSUserDefaults standardUserDefaults] setBool:randomValue forKey:randomKey];
[[NSUserDefaults standardUserDefaults] synchronize];

下面是我发现的另一种避免启动阵列的解决方案:

//do whatever with [NSUserDefaults standardUserDefaults]
[[NSUserDefaults standardUserDefaults] setBool:randomValue forKey:randomKey];
[[NSUserDefaults standardUserDefaults] synchronize];

上面的答案是正确的。同样奇怪的是,如果我删除了项0(就像我最初做的那样),然后将另一个不相关的键/值对重新保存到plist,它也会保存我的短数组!对我来说,那种行为似乎是一种缺陷。这看起来太不一致了,不是故意的。NSUserDefaults返回的值应该被视为不可变的,即使在幕后它们可能不是。如果忽略这一点,一致性甚至不能得到一点保证。同样奇怪的是,如果我删除了项0(就像我最初做的那样),然后将另一个不相关的键/值对重新保存到plist,它也会保存我的短数组!对我来说,那种行为似乎是一种缺陷。这看起来太不一致了,不是故意的。NSUserDefaults返回的值应该被视为不可变的,即使在幕后它们可能不是。如果忽略这一点,一致性甚至不能得到一点保证。谢谢。这也适用于第1行:
NSMutableArray*Arr=[[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults]ArrayWorkey:accounts]copyItems:YES]这不安全。从NSUserDefaults返回的对象被显式地记录为不可变的。实际上,在这个特定的案例和其他一些案例中,情况并非如此,但这是一个实现细节,利用它可能会导致非常奇怪的错误。将所有从默认值返回的对象视为不可变。谢谢。这也适用于第1行:
NSMutableArray*Arr=[[NSMutableArray alloc]initWithArray:[[NSUserDefaults standardUserDefaults]ArrayWorkey:accounts]copyItems:YES]这不安全。从NSUserDefaults返回的对象被显式地记录为不可变的。实际上,在这个特定的案例和其他一些案例中,情况并非如此,但这是一个实现细节,利用它可能会导致非常奇怪的错误。将从默认值返回的所有对象视为不可变对象。