当我使用此方法class_getName()
时,我发现它是这样声明的:
**OBJC_EXPORT** const char *class_getName(Class cls)
OBJC_EXPORT
是什么意思?
答案 0 :(得分:1)
如果您对符号进行CMD +点击,您会发现它不是关键字。 OBJC_EXPORT
定义为:
#define OBJC_EXPORT OBJC_EXTERN OBJC_VISIBLE
OBJC_EXTERN
是extern "C"
或extern
,具体取决于您是分别编译C ++还是C.
OBJC_VISIBLE
在Windows上为__declspec(dllexport)
或__declspec(dllimport)
,否则为__attribute__((visibility("default"))
。
基本上它是说你可以在外部链接那个符号。
以下是完整列表:
#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
答案 1 :(得分:0)
如果你有三个名为A,B and C
的类,并且所有三个类都不相关(我的意思是不在继承层次结构中)并且你只想访问A中声明的值,那么extern是一个更合适的方法。在这种情况下,您希望在ClassA.h中将变量声明为extern,然后在Class.m中定义它。只要ClassB和ClassC导入ClassA.h,它们就能够链接到相同的extern
定义。
使用OBJC_EXPORT而不是单独使用extern,它在objc-api.h中定义并处理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