プリプロセッサ ディレクティブはコンパイル時に評価されます。
プリプロセッサの最初の実行後
#define itunesFileSharingEnabled [[[NSBundle mainBundle] \
objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]
#if itunesFileSharingEnabled
#define something
#endif
になる
#if [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]
#define something
#endif
2 回目の実行中に、前処理は検証を試み[[[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]
ます。これはコンパイル時に評価できないため、機能しません。これは、実行時にのみ評価できるステートメントです。
あなたがやりたいことがまったく可能かどうかはわかりません。(プリプロセッサについてはあまり知りません)。
実行時にこれらのチェックを実行できることはすでにご存知だと思います
if ([[[NSBundle mainBundle] \
objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]) {
[self foo];
}
else {
[self bar];
}
もう 1 つのオプションは、手動で入力されたプリコンパイラ マクロを強制することです。
これは、一度だけ呼び出されるコードのどこかに入ります。おそらくあなたのライブラリの初期化にあります:
#if HAS_ITUNES_FILESHARING
if (![[[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]) {
[NSException raise:@"MBFileSharingNotActiveButDeclaredException" format:@"File sharing is not active but \"HAS_ITUNES_FILESHARING\" is set to 1"];
}
#else
if ([[[NSBundle mainBundle] objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]) {
[NSException raise:@"MBFileSharingActiveButNotDeclaredException" format:@"File sharing is active but you did not declare it as preprocessor macro. Please set \"HAS_ITUNES_FILESHARING\" to 1"];
}
#endif
これはBuild Settings
asに入力する必要がありますPreprocessor Macro
:
HAS_ITUNES_FILESHARING=1
HAS_ITUNES_FILESHARING=1
がプリプロセッサ マクロ セクションで宣言されていなくても、ファイル共有がアクティブな場合、コードは例外をスローします。
HAS_ITUNES_FILESHARING=1
が宣言されているが、ファイル共有がアクティブでない場合、コードも例外を発生させます。
このようにして、プリプロセッサ マクロが設定と一致していることを常に確認できます。これを 1 回だけ呼び出す場合 (+(void)initialize
パフォーマンスへの影響はまったくないはずです。