使用stringValue进行NSNtring转换的NSNumber失败

时间:2012-09-29 22:18:49

标签: json class nsstring nsnumber

好的,所以我在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

那么,发生了什么?

1 个答案:

答案 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。