我用 NSDictionary & JSON 序列化 & NSUserDefaults 错误地实现了啥?
Posted
技术标签:
【中文标题】我用 NSDictionary & JSON 序列化 & NSUserDefaults 错误地实现了啥?【英文标题】:What am I implementing incorrectly with NSDictionary & JSON serialization & NSUserDefaults?我用 NSDictionary & JSON 序列化 & NSUserDefaults 错误地实现了什么? 【发布时间】:2014-03-18 20:20:57 【问题描述】:我认为我的错误与我没有正确实施我的 NSDictionary 有关。下面是我得到的错误代码。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFDictionary bytes]: unrecognized selector sent to instance 0x16eab400'
错误发生在以下方法中:
- (void)check:(NSData *)json
NSDictionary *json1 = [NSJSONSerialization
JSONObjectWithData:json
options:kNilOptions
error:nil];
NSUserDefaults *userdefaluts = [NSUserDefaults standardUserDefaults];
[userdefaluts setObject:[json1 objectForKey:@"Name"] forKey:@"name"];
[userdefaluts setObject:[json1 objectForKey:KEY_USER_ID] forKey:KEY_USER_ID];
NSLog(@"MainView - check - name: %@",[userdefaluts objectForKey:@"name"]);
NSLog(@"MainView - check - name: %@",[userdefaluts objectForKey:KEY_USER_ID]);
【问题讨论】:
检查作为参数传递的'json'对象是否肯定是NSData对象。看起来它实际上可以是 NSDictionary。 该方法有一个error
参数,但您传递了nil
并要求我们猜测问题所在。使用框架提供的工具。
谢谢@RafałAugustyniak。你的评论引导我走向正确的方向。我所要做的就是将 NSdata 更改为 NSDictionary。
【参考方案1】:
可能性:您的代码可能在后台线程上运行,而 NSUserDefaults 不喜欢它。 json1 上的 objectForKey 调用之一返回 nil 并且出现问题。我会将两个 [json1 objectForKey:...] 结果存储在一个局部变量中并 NSLog 它们。逐步调试调试器中的代码。
还有很大的可能性:您传入的对象“json”实际上不是 NSData。在上面做一个 NSLog 并检查它到底是什么。它可能是 NSDictionary* 而不是 NSData*,这可以解释为什么将用于 NSData(长度)的方法发送到 NSDictionary。检查对方法的调用。您是否传递了“id”类型的对象?
【讨论】:
您的巨大可能性实际上就是答案!我的数据是 NSDictionary!【参考方案2】:您的数据可能是错误的,NSJSONSerializer 无法解析它,试试这个来显示是否有错误: NSError *jsonError; NSDictionary *json1 = [NSJSONSerialization JSONObjectWithData:json options:kNilOptions error:&jsonError]; 如果(json错误) NSLog(@"无法解析json数据,错误:%@",jsonError.localizedDescription);
【讨论】:
【参考方案3】:所以答案很简单。我所要做的就是改变进入 NSDictionary 的数据类型。下面是正确的代码。
- (void)check:(NSDictionary *)json
NSDictionary *json1 = [NSJSONSerialization
JSONObjectWithData:json
options:kNilOptions
error:nil];
NSUserDefaults *userdefaluts = [NSUserDefaults standardUserDefaults];
[userdefaluts setObject:[json1 objectForKey:@"Name"] forKey:@"name"];
[userdefaluts setObject:[json1 objectForKey:KEY_USER_ID] forKey:KEY_USER_ID];
NSLog(@"MainView - check - name: %@",[userdefaluts objectForKey:@"name"]);
NSLog(@"MainView - check - name: %@",[userdefaluts objectForKey:KEY_USER_ID]);
【讨论】:
以上是关于我用 NSDictionary & JSON 序列化 & NSUserDefaults 错误地实现了啥?的主要内容,如果未能解决你的问题,请参考以下文章
iOS - 数组与字典(NSArray & NSDictionary)