关于ios:Objective-C中的OBJC_EXPORT关键字是什么意思?

What does OBJC_EXPORT keyword in Objective-C mean?

当我使用这个方法class_getName()时,我发现它是这样声明的:

1
**OBJC_EXPORT** const char *class_getName(Class cls)

OBJC_EXPORT 是什么意思?


如果你 CMD 点击符号,你会看到它不是关键字。 OBJC_EXPORT 定义为:

1
#define OBJC_EXPORT  OBJC_EXTERN OBJC_VISIBLE

OBJC_EXTERNextern"C"extern,这取决于你是分别编译 C 还是 C。

OBJC_VISIBLE 在 Windows 上是 __declspec(dllexport)__declspec(dllimport),否则为 __attribute__((visibility("default"))

基本上是说您可以在外部链接该符号。

这里是完整列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#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


如果您有三个分别名为 A,B and C 的类并且所有三个类都不相关(我的意思是不在继承层次结构中)并且您只想访问在 A 中声明的值,那么 extern 是一种更合适的方法。在这种情况下,您想在 ClassA.h 中将变量声明为 extern,然后在 Class.m 中定义它。只要 ClassB 和 ClassC 导入 ClassA.h,它们就能够链接到相同的 extern 定义。

使用 OBJC_EXPORT 比单独使用 extern 更健壮,它在 objc-api.h 中定义,并且也处理 C 下的编译。这是一个代码示例:

1
2
3
4
5
6
7
8
9
10
11
// 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