0

私はライブラリに取り組んでおり、1 つのコードベースで両方のメモリ管理アプローチ (ARC と MRR) をサポートしたいと考えています。

コードに特別なフラグ (-fobjc-arc) を使用することをユーザーに強制したくありません。

preprocessor test: については知ってい#if __has_feature(objc_arc)ますが、それを使用してすべての違いをカバーするベストプラクティスは何ですか?

クリーンで作業しやすいようにするための経験がある人はいますか?

望ましい方法は、コードで使用できる ARC と非 ARC 間の変換にいくつかのマクロを使用することです。

=========

私の問題は受け入れられた回答によって解決されましたが、他の人へのヒントとして、私の問題を処理する方法の最良の例を提供する John Blanco によるブログ投稿を見つけました。

4

4 に答える 4

4

githubのMBProgressHUDのコードを参照してください。私は、それがあなたが望むものだと思います。

#if __has_feature(objc_arc)
#define MB_AUTORELEASE(exp) exp
#define MB_RELEASE(exp) exp
#define MB_RETAIN(exp) exp
#else
#define MB_AUTORELEASE(exp) [exp autorelease]
#define MB_RELEASE(exp) [exp release]
#define MB_RETAIN(exp) [exp retain]
#endif

これは、彼らがこれらのマクロをどのように使用しているかです

self.indicator = MB_AUTORELEASE([[MBRoundProgressView alloc] init]);
于 2013-10-22T15:22:41.330 に答える
4

ARC を使用し、コードを使用するユーザーにファイルごとにコンパイル フラグを設定するように指示し ( -fobjc-arc)、これをヘッダーに追加して強制的に実行させます。

#if !__has_feature(objc_arc)
  #error ARC must be enabled!
#endif

または、ARC を有効にして lib/framework としてビルドします。
メモリ管理コードをプリプロセッサ ディレクティブでラップするのは、ひどい考えです。

于 2013-10-22T15:14:09.243 に答える
1

ARC コードと非 ARC コードの両方をサポートする 1 つの方法は、ターゲット、ビルド フェーズ、およびコンパイル ソース セクションに移動することです。

そこから、すべての .m ファイルが表示されるはずです。次に、任意のファイルに-fno-objc-arcをコンパイラ フラグの下に追加して、コンパイラに ARC を無視するように指示できます。

于 2013-10-22T15:12:11.643 に答える