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

loginDataObject のヘッダー ファイルで宣言されているように、「uid」は NSNumber です。

#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 オブジェクトで 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

それで、何が起こっているのですか?

4

1 に答える 1

2

書いている間に自分の質問に答えたので、先に進んで投稿し、回答を投稿してもよいと思いました。

私が見落としていた重要な点は、例外そのものでした。

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

したがって、-stringValue を送信した "uid" オブジェクトは、NSNumber としてキャストされていたにもかかわらず、実際には NSString オブジェクトでした。

これが発生した理由は、データ ソースが原因です。私のアプリは JSON blob をダウンロードし、それを NSDictionary、NSArray、NSString、および NSNumber オブジェクトに逆シリアル化し、それを Jastor に渡します。Jastor はそれを私が設定した「フレーム」クラスの構造に送り込みます (純粋にプロパティで構成され、1 つの例は上記のとおりです)私の質問では)。

したがって、シーケンスは次のとおりです。

JSON -> NSDictionary -> loginDataObject

loginDataObject のクラスを書いているときに問題が発生し、uid を NSNumber にしました (常に数値です)。

ただし、何らかの理由で、ブロブをダウンロードしている Web サイトの JSON シリアライザーは、この uid 値を引用符で囲み、文字列にします。次に、JSON を逆シリアル化すると、NSNumber ではなく NSString になります。Jastor はよく知らないので、文字列へのポインターを NSNumber *uid プロパティに貼り付けます。残りは履歴です。

実際には、スローされた正確な例外にもう少し注意を払い、デシリアライズしている JSON をより綿密に精査することが教訓になります。

于 2012-09-29T22:18:49.010 に答える