使用方法setValue:forPath时,NSInternalInconsistencyException与NSUserDefaults [英] NSInternalInconsistencyException with NSUserDefaults when using method setValue: forPath

查看:112
本文介绍了使用方法setValue:forPath时,NSInternalInconsistencyException与NSUserDefaults的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的代码如下:

NSMutableDictionary *configure = [[NSUserDefaults standardUserDefaults] objectForKey:@"configure"];
if (!configure){    
configure = [NSMutableDictionary dictionary];
[configure setValue:[NSMutableDictionary dictionary] forKeyPath:@"select"] ;

[configure setValue:[NSMutableDictionary dictionary] forKeyPath:@"select.around"];
[configure setValue: @"All" forKeyPath:@"select.around.name"];

[[NSUserDefaults standardUserDefaults] setObject:configure forKey:@"configure"];
[[NSUserDefaults standardUserDefaults] synchronize];
    }
NSString *keyPath = @"configure.select.around";
NSMutableDictionary *aroundConfigure = [[[NSUserDefaults standardUserDefaults] valueForKeyPath:keyPath] mutableCopy];
[aroundConfigure setObject:@"" forKey:@"name"];
[[NSUserDefaults standardUserDefaults] setValue:aroundConfigure forKeyPath:keyPath];

每次都崩溃,并显示以下错误:

It's crashing every time with the error below:

** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00daebe9 __exceptionPreprocess + 185
    1   libobjc.A.dylib                     0x00f035c2 objc_exception_throw + 47
    2   CoreFoundation                      0x00d67628 +[NSException raise:format:arguments:] + 136
    3   CoreFoundation                      0x00d6759a +[NSException raise:format:] + 58
    4   CoreFoundation                      0x00dad401 -[__NSCFDictionary setObject:forKey:] + 209
    5   Foundation                          0x0004b34d -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 399
    6   Foundation                          0x0004b34d -[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 399
    7   Untitled                            0x00002429 -[UntitledAppDelegate application:didFinishLaunchingWithOptions:] + 774
    8   UIKit                               0x002b81fa -[UIApplication _callInitializationDelegatesForURL:payload:suspended:] + 1163
    9   UIKit                               0x002ba55e -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:] + 439
    10  UIKit                               0x002c4db2 -[UIApplication handleEvent:withNewEvent:] + 1533
    11  UIKit                               0x002bd202 -[UIApplication sendEvent:] + 71
    12  UIKit                               0x002c2732 _UIApplicationHandleEvent + 7576
    13  GraphicsServices                    0x016e4a36 PurpleEventCallback + 1550
    14  CoreFoundation                      0x00d90064 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
    15  CoreFoundation                      0x00cf06f7 __CFRunLoopDoSource1 + 215
    16  CoreFoundation                      0x00ced983 __CFRunLoopRun + 979
    17  CoreFoundation                      0x00ced240 CFRunLoopRunSpecific + 208
    18  CoreFoundation                      0x00ced161 CFRunLoopRunInMode + 97
    19  UIKit                               0x002b9fa8 -[UIApplication _run] + 636
    20  UIKit                               0x002c642e UIApplicationMain + 1160
    21  Untitled                            0x00002100 main + 102
    22  Untitled                            0x00002091 start + 53
)
terminate called after throwing an instance of 'NSException'


我知道setObject:forKey:应该与可变字典一起使用.将KVO与NSUserDefaults一起使用是否有任何问题?顺便说一下,我使用的平台是iPhone.


I know that setObject:forKey: should used with a mutable dictonary . Is there any problem using KVO with NSUserDefaults? By the way, the platform I use is iPhone.

推荐答案

您的代码没有执行您认为正在做的事情:

Your code isn't doing what you think it is doing:

NSMutableDictionary *configure = [[NSUserDefaults standardUserDefaults] objectForKey:@"configure"];

这会将configure设置为标准默认值,即键configure

This sets configure to be the value of your standard defaults to the value of the key configure

configure = [NSMutableDictionary dictionary];

这会将configure设置为一个新的空字典,而不是您从用户默认值获得的字典

This sets configure to a new, empty dictionary, not the one you got from User defaults

[configure setValue:[NSMutableDictionary dictionary] forKeyPath:@"select"] ;

您现在将空字典用作键select

You now put an empty dictionary as the value for the key select

[configure setValue:[NSMutableDictionary dictionary] forKeyPath:@"select.around"];

您要为此密钥路径添加另一个空字典

You are adding another empty dictionary for this key path

[configure setValue: @"All" forKeyPath:@"select.around.name"];

您正在为此键路径设置一个字符串值

And you are setting a string value for this key path

[[NSUserDefaults standardUserDefaults] setObject:configure forKey:@"configure"];

您现在正在将此奇数字典放入NSUserDefaults

You are now putting this odd dictionary into NSUserDefaults

[[NSUserDefaults standardUserDefaults] synchronize];

NSString *keyPath = @"configure.select.around";

NSMutableDictionary *aroundConfigure = [[[NSUserDefaults standardUserDefaults] valueForKeyPath:keyPath] mutableCopy];

这只是一个空的可变字典

This is just an empty mutable dictionary

[aroundConfigure setObject:@"" forKey:@"name"];

您正在为此字典中的某个键设置一个空字符串

You are setting an empty string for some key in this dictionary

[[NSUserDefaults standardUserDefaults] setValue:aroundConfigure forKeyPath:keyPath];

然后将这个奇数字典设置为用户默认值.

And then you set this odd dictionary into the the user defaults.

这一切都很令人困惑.

您想做什么?

编辑后添加

如果您简化"了代码,我们就看不到它应该做什么.

There's no point providing code if you've "simplified" it we can't see what it's supposed to do.

您的应用程序崩溃是因为您尝试更改不可变的NSDictionary的键值对,而不是NSMutableDictionary.请参阅跟踪的第6行.

Your app is crashing because you are trying to change a key value pair of a NSDictionary which is immutable instead of a NSMutableDictionary. See line 6 of your trace.

由于您提供了简化"代码-我不知道您在哪里进行此操作.

Since you've provided "simplified" code - I don't know where you are doing this.

这篇关于使用方法setValue:forPath时,NSInternalInconsistencyException与NSUserDefaults的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆