我用 NSDictionary 和 JSON 序列化和 NSUserDefaults 错误地实现了什么?



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

最新更新