私はこの方法class_getName()
を使用しています、私はそれがこのように宣言されて見つける:Objective-CのOBJC_EXPORTキーワードは何を意味しますか?
**OBJC_EXPORT** const char *class_getName(Class cls)
OBJC_EXPORT
は何を意味するのでしょうか?
私はこの方法class_getName()
を使用しています、私はそれがこのように宣言されて見つける:Objective-CのOBJC_EXPORTキーワードは何を意味しますか?
**OBJC_EXPORT** const char *class_getName(Class cls)
OBJC_EXPORT
は何を意味するのでしょうか?
シンボルの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
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