metamacro_argcount(…)
metamacro_argcount一个可以获得传入参数个数的Macro,1
2
3metamacro_argcount(NSObject, version); 结果为2.
metamacro_argcount(NSObject, version, super); 结果为3
metamacro_argcount(NSObject, version, nil); 结果为3
这个宏在编译期(并非运行期)就获得参数个数,是不是很神奇?来看看里面有什么鬼1
2
3//RACmetamacros.h中
metamacro_at(20, __VA_ARGS__, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
需要展开下,以下就metamacro_argcount(NSObject, version)
做展开1
2
3metamacro_argcount(NSObject, version)
-->
metamacro_at(20, NSObject, version, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
metamacro_at(N, ...)
定义:
1 |
|
继续展开1
2
3metamacro_at(20, NSObject, version, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1)
-->
metamacro_concat(metamacro_at,20)(NSObject, version, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
metamacro_concat
定义:1
2
3
metamacro_concat_(A, B)
宏定义中A ## B
,##
对A,B分割,再将A,B代入拼接,
所以上文中`metamacro_concat(metamacro_at,20)就变成了metamacro_at201
2
3metamacro_concat(metamacro_at,20)(NSObject, version, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
-->
metamacro_at20(NSObject, version, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
metamacro_at20又是一个宏定义metamacro_at##Nth
定义:1
2
3
4
...
继续转化 = =…1
2
3
4
5
6
7
8
9
10
11
12NSObject对应_0
version对应_1
20对应_2
...
3对应_19
还剩(2,1)就是metamacro_head(__VA_ARGS__)的参数
所以
metamacro_at20(NSObject, version, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1);
-->
metamacro_at20(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, _16, _17, _18, _19, ...) metamacro_head(2,1)
metamacro_head
定义:1
2
3
metamacro_head_(__VA_ARGS__, 0)
再转化1
2
3
4metamacro_head(2,1)
-->
metamacro_head_(2,1,0) 2
FIRST==2
经过各种展开1
2
3
4
5metamacro_argcount(NSObject, version)
-->
metamacro_head(2,1)
-->
2
硬是获得了参数个数2……
大家都很熟悉数组,用数组来类比下metamacro_argcount的功能1
2
3NSArray *array20=@[@20, @19, @18, @17, @16, @15, @14,@13, @12, @11, @10, @9, @8, @7, @6, @5, @4, @3, @2, @1,@0];
array20就取第20个
array20[20]=0默认没有参数
当我有参数的时候,我就插入到数组前面,取值就只取第20个元素
插入NSObjcet1
2NSArray *array20=@[NSObjcet,@20, @19, @18, @17, @16, @15, @14,@13, @12, @11, @10, @9, @8, @7, @6, @5, @4, @3, @2, @1,@0];
array20[20]的值就变成了@1,就是1个参数
再插入version1
2NSArray *array20=@[NSObjcet,version,@20, @19, @18, @17, @16, @15, @14,@13, @12, @11, @10, @9, @8, @7, @6, @5, @4, @3, @2, @1,@0];
array20[20]的值就变成了@2,就是2个参数