(一)神奇的Macros
先说说RAC中必须要知道的宏
- RAC(TARGET,[KEYPATH,[NIL_VALUE]])
使用:
作用是观察TARGET的KEYPATH属性,相当于KVO,产生一个RACSignal
最常用的使用,和RAC宏绑定属性:
上面的代码将label的输出和model的name属性绑定,实现联动,name但凡有变化都会使得label输出
这对宏在 RACEXTScope.h 中定义,RACFramework好像没有默认引入,需要单独import
他们的作用主要是在block内部管理对self的引用:
这个宏为什么这么吊,前面加@,其实就是一个啥都没干的@autoreleasepool {}前面的那个@,为了显眼罢了。
这两个宏一定成对出现,先weak再strong
除了RAC中常用宏的使用,有一些宏的实现方法也很值得观摩。
举个高级点的例子:
要干的一件事,计算一个可变参数列表的长度。
第一反应就是用参数列表的api,va_start va_arg va_end遍历一遍计算个和,但仔细想想,对于可变参数这个事,在编译前其实就已经确定了,代码里括号里有多少个参数一目了然。
RAC中RacMetamarcos.h中就有一系列宏来完成这件事,硬是在预处理之后就拿到了可变参数个数:
这个宏由几个工具宏一层层展开,现在模拟一下展开过程:
1. 假如我们要计算的如下:
2. 于是乎第一层展开后:
intcount=Metamacro_at(20,a,c,1)3. 再看Metamacro_at的定义:
4. 于是乎第二层展开后:
intcount=Metamacro_at20(a,1);5. 再看Metamacro_at20这个宏干的事儿:
6. 于是乎第三层展开后,相当于截断了前20个参数,留下剩下几个:
intcount=Metamacro_head(3,serif;font-size:14px;line-height:25.2000007629395px;">
7. 这个Metamacro_head: