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

时间:2016-10-14 05:56:45

标签: ios xcode

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

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

OBJC_EXPORT是什么意思?

2 个答案:

答案 0 :(得分:1)

如果您对符号进行CMD +点击,您会发现它不是关键字。 OBJC_EXPORT定义为:

#define OBJC_EXPORT  OBJC_EXTERN OBJC_VISIBLE

OBJC_EXTERNextern "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