10

同じファイルに、ARC と非 ARC をサポートするコードを書きたいと考えています。そのためには、いくつかのマクロが必要です。

#ifdef ARC_ENABLED 
NSLog(@" ARC enabled ");
#else
NSLog(@" ARC disabled ");
[self release];
#endif

このマクロを実現する方法、どんな種類のマクロも利用できますか? 私にお知らせください。サポートに感謝します 注: ARC_ENABLED ちょうど私が例として書いた

4

2 に答える 2

27

目的の C マクロがあり__has_feature、それを使用してアークが有効になっているかどうかを確認できます。

Clang 言語拡張ドキュメントから

自動参照カウント

Clang は、Objective-C での自動参照カウントのサポートを提供します。これにより、保持/解放/自動解放メッセージを手動で送信する必要がなくなります。自動参照カウントに関連する機能マクロが 2 つあります。 __has_feature(objc_arc)は、一般的に自動参照カウントの可用性を示し、自動参照カウントにはObjective-C オブジェクトへのポインター__has_feature(objc_arc_weak) のサポートも含まれていること を示します。__weak

機能チェックマクロのセクションは非常に読みやすいです。

こんな感じで使えます..

#if !__has_feature(objc_arc)
    //Do manual memory management...
#else
    //Usually do nothing...
#endif

この回答から恥知らずにコピーされたコード部分。

于 2012-06-07T10:44:37.017 に答える
2

以下は、いくつかの健全性チェックとともに、USING_ARC, USING_MRC&を 0 または 1 に定義します。USING_GC

// Utility macros (undefined below)

#define PREFIX_ONE(a) 1##a
#define EMPTY_DEFINE(a) (PREFIX_ONE(a) == 1)

// Memory management kind

#if !defined(USING_GC)
#  if defined(__OBJC_GC__)
#     define USING_GC 1
#  else
#    define USING_GC 0
#  endif
#elif EMPTY_DEFINE(USING_GC) 
#   undef USING_GC
#   define USING_GC 1
#endif

#if !defined(USING_ARC)
#  if __has_feature(objc_arc)
#     define USING_ARC 1
#  else
#    define USING_ARC 0
#  endif
#elif EMPTY_DEFINE(USING_ARC)
#   undef USING_ARC
#   define USING_ARC 1
#endif

#if !defined(USING_MRC)
#  if USING_ARC || USING_GC
#     define USING_MRC 0
#  else
#    define USING_MRC 1
#  endif
#elif EMPTY_DEFINE(USING_MRC)
#   undef USING_MRC
#   define USING_MRC 1
#endif

// Remove utility

#undef PREFIX_ONE
#undef EMPTY_DEFINE

// Sanity checks

#if USING_GC
#   if USING_ARC || USING_MRC
#      error "Cannot specify GC and RC memory management"
#   endif
#elif USING_ARC
#   if USING_MRC
#      error "Cannot specify ARC and MRC memory management"
#   endif
#elif !USING_MRC
#   error "Must specify GC, ARC or MRC memory management"
#endif

#if USING_ARC
#   if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_6
#      error "ARC requires at least 10.6"
#   endif
#endif

プロジェクト .pch に含まれる適切な .h に配置します

#if USING_xどこでも条件付きコンパイルを制御できるようになりました。

また、たとえばファイルの先頭に以下を含めることで、特定のメモリ モデルでコンパイルされないように一部のファイルを除外することもできます。

#if USING_GC | USING_ARC
   #error "Sorry, this file only works with MRC"
#endif
于 2012-06-07T20:20:11.627 に答える