7

Xcodeはこの行を見て、文句を言いませんでした。プロジェクトがビルドされ、実行時にコードがクラッシュしました。

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

当然のことながら、考えてみると、「%@」が多すぎて、実際の議論がもう1つあります。正しいコードは次のようになります

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

でもお願いします...なぜXcodeは文句を言わなかったのですか?paramカウンターと関係があるのは明らかなことのようです。これはコンパイル時にチェックする必要がありますか?それは「」に固有のもの%@ですか?

お知らせ下さい。

4

1 に答える 1

8

簡単なチェックに基づいて、これがコンパイル時にチェックされていないことは 100% 正しいと思われます。逆に、NSLog がチェックされます。したがって、私のマシンでは、XCode 4.0.2 を使用すると、次のようになります。

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

NSLog に「データ引数よりも '%' 変換が多い」という警告が生成されますが、NSString にはコメントできません。

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

ただし、特に、Foundation クラスの動作を変更し始めた場合にすぐに遭遇する問題を考えると、少なくとも警告が表示されることを期待していたでしょう。

于 2011-07-04T22:03:20.673 に答える