0

文字列を NSLog したいだけだとしましょう-誰かが次の違いを説明できますか:コード1:

NSString *testString;  
testString = [[NSString alloc] init];  
testString = @"Here's a test string in testString!";  
NSLog(@"testString: %@", testString); 

コード 2:

NSString *testString = @"Here's a test string in testString!";
NSLog(testString)

私がARCを使用しているとしましょう。ありがとう

4

2 に答える 2

3

これはあなたが求めているものではないかもしれませんが、2番目の例は悪い習慣です. コンパイラは、 の文字列リテラルを必要としていますNSLog。必須ではありませんが、潜在的なセキュリティの問題を防ぎます (警告に従って)。最初の引数はprintfフォーマッタで解釈されます。フォーマット (最初の引数) に文字列リテラルを使用せず、文字列がユーザー入力の場合、ユーザーは無効なフォーマット データを渡してアプリケーションをクラッシュさせる可能性があります。

ここで脆弱性について読むことができます: http://en.wikipedia.org/wiki/Format_string_attack

この問題を回避するために、「コード 2」を次のように書き直すことができます。

NSString *testString = @"Here's a test string in testString!";
NSLog(@"%@", testString);
于 2013-06-11T22:04:09.250 に答える
3

コード 1:

空の を作成してから破棄していますNSString。次に、フォーマット文字列を使用して文字列リテラルをログに記録します。

コード 2:

(変数を介して) 文字列リテラルを直接ログに記録しようとしています。

理想的なコードは、未使用の文字列を作成しない場所と、ログ中にフォーマット文字列を使用する場所の両方の組み合わせです。

于 2013-06-11T22:05:43.817 に答える