0

定数ファイルがあり、アプリにホワイトラベルを付けられるようにしたいと考えています。

ホワイトラベリングの一部は、クライアントが交換できる画像を定義することです。

これらすべての画像を定義するオーバーヘッドはどのくらいですか?

例えば#define kMPNavigationBarBackgroundImage [UIImage imageNamed:@"nav_bar"]

NSString画像名の定数を定義する価値はありますか?それともこれで大丈夫ですか?

これらの画像は何百もあることを覚えておいてください。これらはすべてこの時点でメモリに読み込まれますか?それとも#define、呼び出されるまで実行されないコード行の単なるパーセホルダーですか?

ありがとう

4

3 に答える 3

2

「#define」はコンパイラによって前処理され、コンパイルがすべてのkMPNavigationBarBackgroundImagesを実行する前に、定義に置き換えられます。ランタイムとは何の関係もありません。

http://www.cplusplus.com/doc/tutorial/preprocessor/

于 2013-02-13T11:44:26.813 に答える
1

要するに、あなたの最後のステートメントは正しいです。の一部を形成するコードは、#defineコードで参照されるまで評価されません。

おそらく、この問題へのより良いアプローチは、これらすべてのアセットを辞書に入れて、必要に応じて「クライアント」がオプションで交換できるようにすることです。辞書は、よく知られている名前をアセットのファイル名にマップします。

sの使用に関する問題#defineは、顧客が定義に適切なコードを配置することに依存していることです。これは、面倒でエラーが発生しやすい例です。

// (Missing end quote)
#define kMPNavigationBarBackgroundImage [UIImage imageNamed:@"nav_bar]

自明ではないコンパイル警告が発生します。

より洗練されたアプローチは、よく知られている名前を単に指定する方法(どこか)を提供することです。

- (UIImage *)imageWithWellKnownName:(NSString *)wellKnownName;

アセットファイル名を検索してロードし、ファイルをロードできなかった場合は例外をスローします。

于 2013-02-13T11:46:14.957 に答える
1

#defineを使用してある種の定数を定義する場合、コード内で定義されたテキストを置き換えるように指示するのは、単なるプリプロセッサディレクティブです。したがって、使用する場合:

#define image [UIImage imageNamed:@"name"];
UIImage *myImage = image;

次に、コンパイル前に次のように変更されます。

UIImage *myImage = [UIImage imageNamed:@"name"];

それはあなたがそれを使うところならどこでも取り替えられるだけです。

お役に立てば幸いです。

:)

于 2013-02-13T11:46:24.093 に答える