4

XCodeでランタイムエラーを引き起こす次のコードがあります

NSString* temp = [[param objectforkey@"firstParam"] stringValue];
int tempNum = [[param objectforkey@"secondParam"] intValue];

param は plist からロードします。firstParam は文字列、secondParam は数値

最初の行でプログラムがクラッシュします。

興味深いのは、ハードカーストを実行すると機能することです。

NSString* temp = (NSString*)[param objectforkey@"firstParam"];
int tempNum = [[param objectforkey@"secondParam"] intValue];

intValue を使用して int にキャストする必要があるのに、NSString を取得するためにハード キャストを行う必要があるという点で、ID の実装に一貫性がないのはなぜだろうか? なぜstringValueではないのですか?

4

5 に答える 5

8

への最初の呼び出しobjectForKeyは、 であるオブジェクトを返しますNSString。 実行時エラーが生成される理由でNSStringあるメソッドがありません。すでに文字列になっているstringValueものの を取得しても意味がありません。stringValue

の 2 番目の呼び出しは をobjectForKey返しますNSNumberNSNumberにはintValueメソッドがあるため、エラーは発生しません。

2 番目のケースでは、戻り値の型を から に変更していNSNumberますint。最初のケースでは、返されたオブジェクトはすでに であり、文字列NSStringの を取得しようとしても意味がありませんstringValue

于 2013-06-08T04:12:22.080 に答える
6

この呼び出し[param objectforkey@"firstParam"]は NSString を返すため、stringValue を呼び出す必要はありません。さらに、NSString には「stringValue」というメソッドがないため、それが問題の原因です。

これを呼び出すだけです:NSString *temp = (NSString *)[param objectForKey:@"firstParam"];

また、セレクターはobjectForKey:であり、 objectforkey :ではないことに注意してください(大文字が重要です)。

そして、あなたの質問に答えると、NSNumber はクラスなので、どのオブジェクトも「int」ではなく、NSNumber ポインターです。floatValue が「float」を返すように、intValue は実際の「int」を返します (NSNumber は任意の型の数値を表すことができます)。NSString の場合、必要ありません。NSString の型は 1 つしかないためです (ただし、 を返すメソッドがあり、const char *それは次のように使用されchar *string = [[param objectForKey:@"firstParam"] cString];ます ... いずれにせよ、Objective-C アプリにはあまり役に立ちません)。

于 2013-06-08T04:24:34.920 に答える
2

JSON を返す Web サービスを呼び出すとします。

次に、データを処理します

 NSDictionary *json_response = [NSJSONSerialization JSONObjectWithData:data
                                                                 options:0
                                                                 error:NULL];

今、あなたはこのようなことを試します

 NSString *name = [[object objectForKey:@"Name"] stringValue];

その後、エラーが発生します....

mttrbが言及しているように、 stringValue、objectForKey のデフォルトの戻り値が String であるため、エラーが発生するため、この場合の潜在的な修正は次のようになります。

NSString *name = [object objectForKey:@"Name"];

これが誰かのヒントになることを願っています!

于 2016-02-18T01:54:32.233 に答える
0

@Torge の回答を完成させて、objectForKey メソッドから常に NSString を取得するソリューションを追加します。

NSObject * value = [param objectForKey@"firstParam"];
NSString *stringValue;
if ([value isKindOfClass:[NSString class]]) {
   //Handle string
   stringValue = (NSString *)value;

}
else if([value isKindOfClass:[NSNumber class]]){
    //Handle NSNumber
    stringValue = [((NSNumber *) value) stringValue];

}
else {
    //Handle other case
} 
于 2016-10-14T06:54:15.257 に答える