好的,所以我在SO上发现了另一个类似的问题,但是这个人正在向一个数组发送一个stringValue消息,我有不同的情况。
这是正在死亡的代码行:
AppModel.instance.loginDataObject.uid.stringValue
出于调试目的,我将它放入NSLog中,如下所示:
NSLog(@"uid stringValue: %@", AppModel.instance.loginDataObject.uid.stringValue);
抛出的异常是:
-[__NSCFString stringValue]: unrecognized selector sent to instance 0xa8525d0
现在,“uid”是一个NSNumber,在loginDataObject的头文件中声明:
#import "Jastor.h"
@interface LDLoginData : Jastor
@property (nonatomic, strong) NSString *api_login_key;
@property (nonatomic, strong) NSString *clazz_reg_code;
@property (nonatomic, strong) NSNumber *current_clazz;
@property (nonatomic, strong) NSString *mail;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *profile_first_name;
@property (nonatomic, strong) NSString *profile_last_name;
@property (nonatomic, strong) NSNumber *teacher_id;
@property (nonatomic, strong) NSNumber *uid;
@property (nonatomic, strong) NSString *user_type;
@property (nonatomic, strong) NSNumber *va_user_clazz_id;
@end
请注意,我使用Jastor类来填充loginDataObject。
此外,调试器命令显示它是NSNumber:
po AppModel.instance.loginDataObject.uid
(NSNumber *) $1 = 0x0a8525d0 7593
但不知怎的,它没有响应stringValue选择器:
po AppModel.instance.loginDataObject.uid.stringValue
error: property 'stringValue' not found on object of type 'NSNumber *'
error: 1 errors parsing expression
即使此方法为clearly documented。
现在,如果我在uid对象上调用description方法:
po AppModel.instance.loginDataObject.uid.description
error: property 'description' not found on object of type 'NSNumber *'
error: 1 errors parsing expression
它在控制台中不喜欢它,但如果我将代码更改为:
NSLog(@"uid stringValue: %@", AppModel.instance.loginDataObject.uid.description);
代码执行,我在控制台中得到了这个:
2012-09-29 15:02:11.829 MyApp[28661:c07] uid stringValue: 7593
那么,发生了什么?
答案 0 :(得分:2)
我在写这篇文章时回答了我自己的问题,所以我想我也可以继续发布并发布答案。
我忽略的关键点是例外本身:
-[__NSCFString stringValue]: unrecognized selector sent to instance 0xa8525d0
因此,我发送-stringValue的“uid”对象实际上是一个NSString对象,即使它已被强制转换为NSNumber。
之所以发生这种情况,是因为数据来源。我的应用程序下载一个JSON blob,将其反序列化为NSDictionary,NSArray,NSString和NSNumber对象,然后将其传递给Jastor,后者将其泵入我设置的“框架”类结构中(纯粹由属性组成,一个示例在上面在我的问题)。
所以序列是:
JSON - > NSDictionary - > loginDataObject
当我编写loginDataObject的类时,出现了问题,我使用了一个NSNumber(它一直是数字)。
但是,出于某种原因,我正在下载blob的网站上的JSON序列化程序会在这个uid值周围添加引号,使其成为一个字符串。然后,当我反序列化JSON时,它变为NSString而不是NSNumber。 Jastor,不知道更好,将指向字符串的指针粘贴到我的NSNumber * uid属性中,剩下的就是历史了。
实际上,我们应该更多地关注所引发的确切异常,并更仔细地审查一个正在反序列化的JSON。