バージョン 4.2.x までの Xcode では、プロジェクトにファイルをドラッグ&ドロップして追加するとき、コピーするかどうかや、ターゲットに追加するかどうかのチェックボックスは前回の選択状態を引き継ぐという挙動でした。
しかし、バージョン 4.3 になってからはターゲットに追加するかどうかのチェックボックスについてのみ、追加しようとしているファイルの拡張子によって、選択状態が変化するようになりました。
ざっと調べた限りでは、追加しようとするファイルが .m ファイルだけの場合はチェックが選択済みになり、.h が含まれる場合は選択が解除されているようです。
具体的には下記のように JSONKit.h と JSONKit.m を追加しようとすると、.h ファイルが含まれているために選択状態は解除された状態でダイアログが表示されます。
もし、選択状態が解除されていることに気づかずに、そのままプロジェクトに追加してしまうと、プロジェクトには追加されるもののコンパイル対象には含まれないという状態になってしまいます。
この状態は非常に危険で、ヘッダファイルは参照できるためにコンパイル時に警告は出ないし、Objective−Cの場合はたいていリンクもできてしまいます。特に例のJSONKitのような標準クラスをカテゴリで拡張するようなライブラリだとまずビルド時に問題は起こりません。
もちろんコンパイルされないのでオブジェクトができませんから実行時にエラーになりますが、この「プロジェクトに追加されているけれどターゲットに含まれていない」という状態は分かりにくいので問題の解決が遅れることも多々あります。
というわけで、けっこう何も考えずにリターンを押しがちなところだと思いますが、少し注意する必要があるという話でした。
※Xcode 4.3.1 は今ダウンロード中なのでアップデートが済んだら検証します。
Xcode 4.3.1 でも同じ挙動でしたorz... ファイル追加するたびに神経使うのもアレなので、要望としてバグレポートですね。
xcode4.3にソースファイルをドラッグアンドドロップしてビルドしたら、そんなシンボル無いと叱られた。メニューからadd filesをしたら直った。バグか?
@akiraak ドラッグアンドドロップだとTagertのBuildPhases->CompileSourcesに登録されないようです。自分もハマリました。以前はそんなことなかったですよね?
2012-03-07 17:55:43 via YoruFukurou to @akiraak
@kacchi0516 @akiraak たぶんXcode 4.3からターゲットのチェックが外れてることがよくあって、たいていそのせいですね。
2012-03-07 17:56:54 via Echofon to @kacchi0516
@k_katsumi @akiraak なるほど!今、試しにやってみたらなぜかUnitTestの方だけにチェックが・・・これが原因なんですね
2012-03-07 17:58:50 via YoruFukurou to @k_katsumi
@kacchi0516 @akiraak そうなんです。そのターゲットに追加もれはすごくわかりにくくて、依存関係が解決していればビルドは成功するので、実行した段階で必要なクラスやメソッドが無くてクラッシュということになるので下手すると気づかずにリリースすることも。。。
2012-03-07 18:06:11 via Echofon to @kacchi0516
なるほど、Xcode4.3でプロジェクトにファイルをドラッグ&ドロップで追加するとき、.mだけだったらターゲットにチェックが付いて、.hが含まれていると(.hと.mのセットでも)チェックが外れると。余計なお世話すぎる。
@k_katsumi なんだろう、その謎仕様w
@cheebow いやホントいらん親切ですよ。悲劇が起こる気がします。
2012-03-07 18:19:16 via Echofon to @cheebow
twitter:177334116054863873:tree