12

私は言う例外を得ました:

-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance

NSNullキーを使ってオブジェクトにアクセスしようとしているということですか?これを引き起こす原因と、それを修正またはさらにデバッグする方法について何か考えはありますか?

4

3 に答える 3

15

これを修正する方法は、NSNull オブジェクトで objectForKeyedSubscript を試行しないことです。(JSON データを処理していて、NULL 値に対する準備ができていないに違いありません。)

(そしてどうやら objectForKeyedSubscript は、新しい array[x] 表記が変換したものです。)

(アプリには NSNull オブジェクトが 1 つしかない==ため、と比較するだけで NSNull をテストできることに注意してください。)[NSNull null]

于 2013-03-06T01:29:05.380 に答える
2

エディタの指示に関係なく、保存している値が何であれ、実行時に を保存しNSNull、後で を呼び出そうとしますobjectForKeyedSubscript。であると予想されるものでこれが起こっていると推測していますNSDictionary。何かのようなもの:

NSString *str = dict[@"SomeKey"]

事前にコードの一部が機能しておらず、そこで調査するか、何らかの検証を実行します。

NSDictionary *dict = ...;

if ( [dict isKindOfClass:[NSDictionary class]] ) {
    // handle the dictionary
}
else {
   // some kind of error, handle appropriately
}

ネットワーク操作からのエラー メッセージを処理するときに、この種のシナリオがよくあります。

于 2013-03-06T01:24:23.240 に答える
1

NSNull にカテゴリを追加して、添え字呼び出しが nil に送信された場合に処理されると予想されるのと同じ方法でこれを処理することをお勧めします。

@implementation NSNull (Additions)

- (NSObject*)objectForKeyedSubscript:(id<NSCopying>)key {
    return nil;
}

- (NSObject*)objectAtIndexedSubscript:(NSUInteger)idx {
    return nil;
}

@end

簡単なテスト方法は次のとおりです。

id n = [NSNull null];
n[@""];
n[0];

このカテゴリでは、このテストを正常に/ソフトに処理する必要があります。

于 2016-07-21T20:19:01.647 に答える