これはばかげた質問かもしれませんが、知りたかっただけです。プログラムで ARC が有効になっているかどうかをコードで検出する必要があります。それ、どうやったら出来るの?チェックできるフラグはありますか?実際の問題は、私がオープンソースのライブラリを作成したことです。私はそれを使用release
しretain
ました。他の誰かが ARC を有効にして私のライブラリ ファイルを使用している場合、エラーを発生させたくありません。どうすればこれを達成できますか? または、ライブラリを使用する前にライブラリをコンパイルするためのツールを提供できる方法はありますか?
3 に答える
#if !__has_feature(objc_arc)
//Do manual memory management...
#else
//Usually do nothing...
#endif
もちろん、これはコンパイル時のチェックです。実行時に ARC をチェックすることはできません。
-fno-objc-arc
別の方法として、ARC を使用するプロジェクトで手動メモリ管理を使用するファイルにコンパイラ フラグを設定することもできます。
これを気にするか、どこでもARCを使用するかは、下位互換性をどの程度にしたい/必要があるかによって異なります。ARC と MRC の両方をサポートするコードは、読み取りと保守が非常に困難になる可能性があります。
プログラムで検出するのではなく、翻訳に基づいて動作します。つまり、ガベージ コレクションとは異なります。ガベージ コレクションはプロセス全体であり、リンクされたすべてのライブラリをサポートする必要があります (そして、そのモードで正しく実装する必要があります)。ARC を使用してコンパイルしたファイルと、使用しないファイルがあります。
ライブラリの配布に関しては、参照カウント操作が条件付きで有効になっている翻訳ベースのシステムは気にしません。私は(個人的に)1つのモデル(あなたの場合はMRC、ARCに移行することを選択するまで)をサポートし、人々がライブラリにリンクするか、設定したターゲットでコンパイルする場合はARCを無効にすることを期待します. 機能の存在に基づいてコードを条件付きで有効化/無効化することは、特にライブラリのコード行の 9% に影響を与える可能性がある場合に、困難なバグを求めています。
いいえ、できません。ソースが保持リリースを使用している場合、Xcode は ARC プロジェクトでコンパイルされません。