1

メソッドでは、次のコードがあります。

NSString* tempString = (NSString*)arg;
NSArray* notificationDetails = [tempString componentsSeparatedByString:@"##"];
NSString* tempString1 = [notificationDetails objectAtIndex:2];
.
.
.
.
.
. 
NSLog(tempString1);

コードをコンパイルすると、エラーや警告なしでコンパイルされます。ただし、(ブレークポイントを使用したデバッグ モードで) 実行中に、NSLog ステートメントでクラッシュします。私が見ている問題は、「[notificationDetails objectAtIndex:2];」の取得中です。これに対する解決策は何ですか。

4

4 に答える 4

6

使用中...

NSLog(tempString1);

... 危険です。NSLog は任意の文字列を唯一のパラメーターとして受け入れるように見えますが、実際には、呼び出される実際の関数の定義から、最初のパラメーターがフォーマット文字列として内部的に解析されることが明らかです。

void NSLogv (
   NSString *format,
   va_list args
);

つまり、「%」などの形式の意味を持つ文字列内のすべての文字は、文字ではなく形式として解析されます。そのため、文字列「sale 40% off」を渡そうとすると、NSLog は引数を探し、見つからない場合にクラッシュします。

于 2009-12-19T19:32:46.453 に答える
1

使用する

NSLog(@"%@", tempString1);

于 2009-12-19T16:37:15.797 に答える
0

省略記号の長さに応じて、追加の可能性があります。componentsSeparatedByString:自動解放された配列を返します。しかし、私は不十分なコンポーネントを推測します。

于 2009-12-19T19:55:22.547 に答える
0

notificationDetails にはいくつの要素が含まれていますか? 確認するには、次のコードを使用します: NSLog(@"%d elements", [notificationDetails count]);

arg は文字列ですか? NSLog(@"引数のクラスは %@ です", [引数クラス]);

于 2009-12-19T16:40:36.800 に答える