/FOUNDATION_EXPORT-extern-define

The different of FOUNDATION_EXPORT&extern&#define

Primary LanguageObjective-C

首次看这3种大概的意思

FOUNDATION_EXPORT是Fundation框架里面的宏 c/c++中不能使用
extern是c/c++的关键字,oc/c/c++通用
#define是oc/c/c++通用宏定义关键字

再看看他们的用法

.h image.png .m image.png

比较结果

image.png

ida反编译下的差异

image.png

那么在项目里面应该怎么使用这3种来声明常量?

  • 三者的区别已经简单解释过了,前2种可以说没什么区别,说下第3种吧。
  • 比较字符串是否相同除了用运算符 == 还可以用 isEqualToString: ,前2种用运算符 ==和isEqualToString:都没问题,值得注意的是用#define 定义的字符串用运算符 == 比较的话会提示警告Direct comparison of a string literal has undefined behavior(但是也能正常编译)。
  • 个人比较推荐使用FOUNDATION_EXPORT来声明,最好是随官方做法,以防官方有什么变动。MJExtension也把extern替换成了FOUNDATION_EXPORT(https://github.com/CoderMJLee/MJExtension/commit/9c4f7f2d95158368532952890c405936a69171f7)
  • 如果为了省事直接用 #define 也是可以的(例如:#define ScreenWidth [UIScreen mainScreen].bounds.size.width)但是要注意 #define 只是 内容拷贝