2012-09-29 34 views
0

好的,所以還有另一個類似的問題,我發現這個在SO上,但這傢伙發送一個stringValue消息給一個數組,並且我有不同的情況。NSNumber與stringValue的NSString轉換失敗

這是代碼是死於行:

AppModel.instance.loginDataObject.uid.stringValue 

只是爲了調試的目的,我把它改成一個NSLog的,就像這樣:

NSLog(@"uid stringValue: %@", AppModel.instance.loginDataObject.uid.stringValue); 

正被拋出的異常:現在

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

, 「流體」 是一個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對象的描述方法:

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 

那麼,究竟是怎麼回事?

回答

2

我在寫作時回答了我自己的問題,所以我想我可能會繼續併發布它,併發布答案。

,我忽略了關鍵的一點是例外本身:

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

因此,「UID」對象,我會發送-stringValue實際上是在心臟一個NSString對象,即使它已經投作爲一個NSNumber。

發生這種情況的原因是因爲數據源。我的應用程序下載一個JSON blob,將其反序列化爲NSDictionary,NSArray,NSString和NSNumber對象,然後將它傳遞給Jastor,將其抽成爲我設置的「框架」類的結構(純粹由屬性組成,在我的問題)。

所以順序是:

JSON - >的NSDictionary - > loginDataObject

的問題出現了,當我在寫loginDataObject的課,和我做了UID一個NSNumber(它是數字的所有的時間)。

但是,由於某種原因,我正在下載blob的網站上的JSON序列化程序將引號圍繞此uid值,使其成爲字符串。然後,當我反序列化JSON時,它變成了NSString而不是NSNumber。 Jastor,不知道任何更好的,堅持一個指向我的NSNumber * uid屬性的字符串的指針,其餘的是歷史。

真的,這個教訓應該是多注意拋出的確切異常,並更仔細地檢查一下JSON是否是反序列化。