5

コードで参照されているファイルが有効であることを Xcode コンパイラに確認させることはできますか?

NSString を介してプログラムでファイルを自然に参照する場合、Cocoa 開発には複数のポイントがあります。

[UINib nibWithNibName:@"MyNib" bundle:nil];
[UIImage imageNamed:@"MyImage"];
[[UIViewController alloc] initWithNibName:@"MyNib" bundle:nil];

これらのファイル参照が有効かどうかをコンパイル時にチェックする方法はありますか?

上記の方法を使用した後、参照ファイルの名前を変更してしまうことがよくありますが、コードで名前を変更するのを忘れています。すべてが問題なく準拠しており、このファイルにアクセスするアプリの部分にたまたまアクセスした場合にのみ、バグが明らかになります.

この種のエラーを回避するために人々が使用する別のアプローチまたは手法はありますか?
文字列を介してファイル名を参照することは、非常に壊れやすいと感じます。

4

4 に答える 4

4

警告: この回答はほとんど時代遅れです。一般的なアイデアは問題ありませんが、より良い解決策が現在存在しています (たとえば、列挙型を生成する SwiftGen スクリプトを使用した画像アセット)。

Nib は通常、ファイルと同じ名前のクラスを持っています。

[[MyViewController alloc] initWithNibName:NSStringFromClassName([MyViewController class]) bundle:nil];

init私は通常、それをコントローラーのメソッドに隠し[self class]ます。

イメージのロードでは、コンパイル時のチェックが困難です。マクロで自分を助けてください。最初にロード方法を単純なマクロに置き換えます。

#define LOAD_IMAGE(__IMAGE_NAME__) [UIImage imageNamed:__IMAGE_NAME__]

最初にすべきことは、assertこのマクロに を入れて、イメージが正常にロードされたことを常に確認することです。これはコンパイル時のチェックではありませんが、不足しているリソースを見つけるのに役立ちます。

LOAD_IMAGE2 つ目は、ソース ファイルを検索してファイル (括弧内) が存在するかどうかを確認する ruby​​/python/shell/(任意のスクリプト言語) スクリプトを作成することです。シェル スクリプトとしては、非常に単純です (例: を使用grep)。このスクリプトを xcode プロジェクトに追加して、コンパイル時に実行できます。xibs によって参照されるイメージを確認することを忘れないでください。

ただし、多くの場合、イメージ名を動的に作成する必要がありますNSString* imageName = [NSString stringWithFormat:@"image_%i", index]。コンパイル時にこれをチェックする方法はありません。

また、リバース チェックを行うことを忘れないでください。どこにも使用されていない画像ファイルを含めないでください。

于 2013-01-04T19:05:37.400 に答える
3

[UIImage imageNamed:]Kent Sutherlandによる AutoComplete 。
これにより、Xcode 内でのコード補完サポートが提供されます。これは素晴らしいコードです。これはXcode 4.6で機能しています:ここに画像の説明を入力

現在、このプロジェクトは 以外の文字列をサポートしていませんimageNamed:。それらをサポートするために、コンパイル時スクリプトを作成してみます。あるいは、大胆になって、サザーランド氏の素晴らしい作品を拡張しようとするかもしれません。

于 2013-02-02T05:20:30.107 に答える
1

これは、ディスク上のすべての画像を一覧表示するが、コードでは参照されていない、私たちが使用するbashスクリプトです。 https://gist.github.com/3750087

これを逆にして、拡張されていないイメージとxibsをチェックするのは簡単です。とにかく、スクリプトは良い出発点になるはずです

于 2013-01-04T20:16:30.317 に答える
1

Xcodeはこれをサポートしていませんが、この問題が本当にあなたを苦しめている場合は、次のハックを使用できます。

  • すべてのバンドル内ファイルに一意のプレフィックスを付けます(例:app__)
  • プロジェクトにファイルを追加するときは、最初にファイルの名前を変更してこのプレフィックスを追加してください。
  • コンパイル時(配布前)のチェックには、次の2つの部分があります。1)すべての.mファイルを検索し、プレフィックスで始まる文字列を列挙します。プレフィックスは一意であるため、文字列が引用符で囲まれているかどうかを確認する必要はありません。2)各文字列のgrep project.pbxprojを使用して、文字列がバンドルに含まれているかどうかを確認します。

少しの努力で、このプロセスはほとんど自動化され、最適化することもできますが、上記のレシピは機能するはずです。

于 2013-01-04T18:48:43.253 に答える