2011-07-04 10 views
7

Xcodeはこの行を見て、不平を言っていませんでした。プロジェクトがビルドされ、実行時にコードがクラッシュしました。Xcode。構文エラーチェックに関する質問

NSString *randomName = [NSString stringWithFormat:@"%@, %@, %@", 
         [randomAjectiveList objectAtIndex:ajectiveIndex], 
         [randomNounList objectAtIndex:nounIndex]]; 

当然のことながら、私は実際の引数その後、代わりに「%@」あまりにも多くの1、1より多くを持って、それについて考えるようになります。正しいコードは次のようになります

NSString *randomName = [NSString stringWithFormat:@"%@, %@", 
         [randomAjectiveList objectAtIndex:ajectiveIndex], 
         [randomNounList objectAtIndex:nounIndex]]; 

私はあなたに質問します...なぜXcodeは文句を言ったのですか? paramカウンターのような明らかなことのようです。これはコンパイル時にチェックしてはいけませんか?おそらく "%@"に固有ですか?

お知らせください。

答えて

8

クイックチェックに基づいて、これはコンパイル時にチェックされていないことが100%正しく、スタティックアナライザでさえ見えます。逆に、NSLogがチェックされます。だから、私のマシン上で、XCodeの4.0.2で、以下:

[NSString stringWithFormat:@"%d %@ %@"]; 
NSLog(@"%d %@ %@"); 

は、「データ引数よりも 『%』変換」ののNSLogに警告を生成しますが、NSStringのにコメントしていません。

この違いは、固定呼び出しと動的呼び出しの違いです。コンパイラは、実行時にNSStringセレクタテーブルを調整するためにカテゴリを宣言したり、低レベルのランタイムを使用したりする可能性があるため、実際にはNSString呼び出しがどこに行くかを完全には特定できません。

しかし、特に、少なくとも警告が必要だったように、Foundationクラスの動作を変更するとすぐに遭遇する問題があるとします。

関連する問題