0

Info.plistファイルのiTunesファイル共有ブールステータスのステータスに基づいて定義を作成したいと思います。だから、私はこれを作成しました:

#define itunesFileSharingEnabled [[[NSBundle mainBundle] \
objectForInfoDictionaryKey:@"UIFileSharingEnabled"] boolValue]

#if itunesFileSharingEnabled
#define something
#endif

しかし、ifは、プリプロセッサ式の開始時にエラーの無効なトークンで失敗します。

#defineitunesFileSharingEnabledを次のように置き換えた場合

#define itunesFileSharingEnabled YES

ifよりも完全にコンパイルされます。したがって、エラーは前の行にあります。Xcodeは#define行を好みません。

私が欲しいのは、iTunesのファイル共有がYESの場合はtrueに、そうでない場合はNOになるようにディレクティブを定義することです。

どうすればそれを宣言できますか?

ありがとう。


編集:

問題は、#errorまたは#warningディレクティブを使用してコンパイラを失敗させたいため、実行時にiTunesファイル共有をチェックする場合に通常を使用できないことです...

たとえば、コードの後半でこれを使用したい

#if iTunesFileSharingEnabled
#error TURN OFF FILE SHARING
#endif

ファイル共有がオンになっている場合、コンパイラを失敗させたい。

4

2 に答える 2

2

プリプロセッサ ディレクティブはコンパイル時に評価されます。

プリプロセッサの最初の実行後

#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 Settingsasに入力する必要がありますPreprocessor Macro:

HAS_ITUNES_FILESHARING=1

HAS_ITUNES_FILESHARING=1がプリプロセッサ マクロ セクションで宣言されていなくても、ファイル共有がアクティブな場合、コードは例外をスローします。

HAS_ITUNES_FILESHARING=1が宣言されているが、ファイル共有がアクティブでない場合、コードも例外を発生させます。

このようにして、プリプロセッサ マクロが設定と一致していることを常に確認できます。これを 1 回だけ呼び出す場合 (+(void)initializeパフォーマンスへの影響はまったくないはずです。

于 2013-02-04T21:08:56.497 に答える
0

実行時に (コードで) 確認することしかできませんが、iTunes ファイル共有はアプリ開発者が開発中に設定するものです。ファイル共有が必要ない場合は、オンにしないでください。

おそらく、実際には自分の左手と右手が交差する目的で作業していて問題を抱えているわけではありません - コードを書いている状況にある可能性が高いです (iTunes ファイル共有をオフにしたい) 誰かが使用する他に(誰がそれをオンにした可能性がありますか)?

その場合、最善の手段はドキュメント (またはライセンス) です。ライブラリのユーザーに、iTunes ファイル共有を使用しないプロジェクトでのみ使用する必要があることを伝えます。別の言い方をすれば、ソース コードを別のプログラマーに渡す場合、そのソース コードで何を行うかを制御することはできますが、最適な使用方法について推奨することはできます。(または、指定した方法でのみソフトウェアを使用することに同意するよう弁護士に依頼してください。ただし、それはもはやプログラミングの問題ではなく、これは法的アドバイスのフォーラムではありません。)

(余談ですが、ビルド システムで興味深いことを行うことも検討できます。たとえば、プロジェクトのメインの Info.plist を読み取るシェル スクリプトのビルド フェーズなどです。ただし、ライブラリがアプリの依存関係にある場合は、最初にビルドする必要があります。 、つまり plist が読み取れないことを意味します。繰り返しになりますが、コミュニケーションが最善の策です。)

于 2013-02-04T22:19:52.413 に答える