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