0

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

尽管此方法已明确记录在案

现在,如果我在 uid 对象上调用描述方法:

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

那么,发生了什么事?

4

1 回答 1

2

我在写它的时候回答了我自己的问题,所以我想我还是继续发布它,然后发布答案。

我忽略的关键点是异常本身:

-[__NSCFString stringValue]: unrecognized selector sent to instance 0xa8525d0

因此,我发送 -stringValue 的“uid”对象实际上是一个 NSString 对象,即使它已被转换为 NSNumber。

发生这种情况的原因是因为数据源。我的应用程序下载一个 JSON blob,将其反序列化为 NSDictionary、NSArray、NSString 和 NSNumber 对象,然后将其传递给 Jastor,Jastor 将其泵入我设置的“框架”类结构中(纯粹由属性组成,一个示例在上面在我的问题中)。

所以顺序是:

JSON -> NSDictionary -> loginDataObject

问题出现在我编写 loginDataObject 的类时,我将 uid 设为 NSNumber(它一直是数字)。

但是,由于某种原因,我从中下载 blob 的网站上的 JSON 序列化程序会在此 uid 值周围加上引号,使其成为字符串。然后,当我反序列化 JSON 时,它变成了 NSString 而不是 NSNumber。Jastor 对此一无所知,将一个指向字符串的指针插入我的 NSNumber *uid 属性中,剩下的就是历史了。

确实,教训是要更加注意引发的确切异常,并更仔细地检查正在反序列化的 JSON。

于 2012-09-29T22:18:49.010 回答