最近有个需求,需要将原来的一个界面扩展出新的样式,供活动使用。
于是翻看工程里原有的代码,发现有些类里都有这样的宏定义调用
1 | @section(@"3", NSStringFromClass([WVRADViewSection class])) |
起初看着有点不解,宏定义不都是直接调用的么,为啥要在前面加个@?
赶紧点进去看看,是这么一个宏定义:
1 |
|
就是load方法的宏定义,方便通过映射来做类型匹配,不需要在管理类里导入太多头文件。
但是我还是比较纠结 compatibility_alias 的用途。网上有解释说这个是苹果留的关键字,用来重构时方便改变类名,但是我查找 _WVRViewModelDispatcher,并没有地方引用,这就很奇怪,为什么要在这里放一行没有用到的代码。
经过一番思考,我突然想起来问题的根源:这个宏定义使用的时候需要在前面加一个@,这么使用肯定要有理由的,我们看到这个宏定义使用了平时很常见的section作为名称,这本身就不合理,但是由于compatibility_alias的存在,使用时就必须在前面加上@,编译器才认为这是在调用一个宏定义,而不是一个变量或者方法。
想到这里,我立即去工程里试了一下,这样果然有效的可以让编译器区分开宏定义和变量。
不得不说,这么使用确实很巧妙,但是也很让人懵逼。
经历此事,我再次深深的感到,项目中写好文档的重要性!!!