作为阿里的开源项目,关注度还是挺高的;它主要用于组件化的项目中,专注于模块之间的跳转。
注册是它的一大难点,有点类似于Android的注解;例如:
@BeeHiveService(HomeServiceProtocol, BHViewController)
这样通过HomeServiceProtocol就能找到BHViewController,即二者建立了关联。
#define BeeHiveService(servicename,impl) \
class BeeHive; char * k##servicename##_service \
BeeHiveDATA(BeehiveServices) = "{ \""#servicename"\" : \""#impl"\"}";
宏定义大家都熟悉,例如:
#define BeeHiveService(servicename) \
char * k##servicename##_service = \""#servicename"\" ;
或者
#define BeeHiveService char * kservicename_service = "servicename";
不同的是,它的宏定义把数据存储到了Mach-o里,合适的时候又读取出来。
接下来看一下读取:
__attribute__((constructor))
void initProphet() {
_dyld_register_func_for_add_image(dyld_callback);
}
其中dyld_callback就是读取数据,具体函数就是
extern uint8_t *getsectiondata(
const struct mach_header_64 *mhp,
const char *segname,
const char *sectname,
unsigned long *size);
语法
1.连接操作符(##)
#define Conn(x,y) x##y
Conn(123, 456) 即 123456
Conn(abc, def) 即 abcdef
2.__attribute((used, section("__DATA,"#sectname" ")))
__attribute 可以设置函数属性、变量属性和类型属性
把sectname字段放到_DATA的section
3._attribute((constructor))
先于构造函数初始化