我在NSDictionary&中错误地实现了什么? JSON序列化& NSUserDefaults的?

时间:2014-03-18 20:20:57

标签: ios nsdictionary nsuserdefaults nsjsonserialization

我认为我的错误与我没有正确实现我的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]);
}

3 个答案:

答案 0 :(得分:1)

您的数据可能不对,NSJSONSerializer无法解析它,请尝试此操作以显示是否存在错误:     NSError * jsonError;     NSDictionary * json1 = [NSJSONSerialization JSONObjectWithData:json选项:kNilOptions错误:& jsonError];     如果(jsonError){        NSLog(@"无法解析json数据,错误:%@",jsonError.localizedDescription);     }

答案 1 :(得分:1)

可能性:您的代码可能在后台线程上运行,NSUserDefaults不喜欢它。对json1的一个objectForKey调用返回nil并且出错了。我将两个[json1 objectForKey:...]结果存储在一个局部变量和NSLog中。逐步调试调试器中的代码。

最大的可能性:你传入的对象“json”实际上并不是NSData。做一个NSLog并检查它到底是什么。它可能是NSDictionary *而不是NSData *,这可以解释为什么NSData(长度)使用的方法被发送到NSDictionary。检查对方法的调用。你传递的是“id”类型的对象吗?

答案 2 :(得分:0)

所以答案很简单。我所要做的就是更改进入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]);
}