我认为我的错误与我没有正确实现我的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]);
}
可能性:你的代码可能运行在后台线程上,而NSUserDefaults不喜欢这样。对json1的objectForKey调用之一返回nil,事情就出错了。我将存储两个[json1 objectForKey:…]]会产生一个局部变量,并对其进行NSLog。一步一步地通过调试器中的代码。
最大的可能性是:你传入的对象json实际上不是NSData。对它进行NSLog并检查它到底是什么。它可能是一个NSDictionary*而不是NSData*,这就解释了为什么用于NSData (length)的方法被发送给NSDictionary。检查对方法的调用。你正在传递一个类型为"id"的对象吗?
您的数据可能是错误的,NSJSONSerializer无法解析它,尝试以下显示是否有错误:NSError * jsonError;NSDictionary *json1 = [NSJSONSerialization JSONObjectWithData:json options:kNilOptions error:&jsonError];如果(jsonError) {NSLog(@"无法解析json数据,错误:%@",jsonError.localizedDescription);}
所以答案很简单。我只需要改变进入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]);
}