2016-10-14 12 views

答えて

1

シンボルのCMD + CLICKをクリックすると、キーワードではないことがわかります。 OBJC_EXPORTは次のように定義されています

#define OBJC_EXPORT OBJC_EXTERN OBJC_VISIBLE 

そしてOBJC_EXTERNあなたは、それぞれ、C++やCをコンパイルしている場合に応じて、extern "C"externのいずれかです。

OBJC_VISIBLEは、Windowsの場合は__declspec(dllexport)または__declspec(dllimport)、それ以外の場合は__attribute__((visibility("default"))です。

基本的には、そのシンボルを外部でリンクすることができます。

ここで完全なリストです:あなたは、それぞれA,B and Cという名前の3つのクラスがあり、すべての3つのクラスは無関係です(私は、継承階層でない意味)とあなただけのAで宣言された値にアクセスしたい場合は、

#if !defined(OBJC_EXTERN) 
# if defined(__cplusplus) 
#  define OBJC_EXTERN extern "C" 
# else 
#  define OBJC_EXTERN extern 
# endif 
#endif 

#if !defined(OBJC_VISIBLE) 
# if TARGET_OS_WIN32 
#  if defined(BUILDING_OBJC) 
#   define OBJC_VISIBLE __declspec(dllexport) 
#  else 
#   define OBJC_VISIBLE __declspec(dllimport) 
#  endif 
# else 
#  define OBJC_VISIBLE __attribute__((visibility("default"))) 
# endif 
#endif 

#if !defined(OBJC_EXPORT) 
# define OBJC_EXPORT OBJC_EXTERN OBJC_VISIBLE 
#endif 
0

externはより適切な方法です。この場合、変数をClassA.hのexternとして宣言し、Class.mで定義します。 ClassBとClassCがClassA.hをインポートする限り、同じextern定義とリンクすることができます。

externを単独で使用するのではなく、objc-api.hで定義されOBJC_EXPORTを使用する方が堅牢で、C++でもコンパイルを処理します。ここでのサンプルコードを示します:

// ClassA.h 
OBJC_EXPORT NSString* commonString; 
... 

// ClassA.m 
NSString* commonString = @"OldValue"; 

// ClassB.m 
#import "ClassA.h" 
... 
commonString = @"NewValue"; // Can be inside a function or method 

参考:this so post

関連する問題