BeeHive总结

  作为阿里的开源项目,关注度还是挺高的;它主要用于组件化的项目中,专注于模块之间的跳转。
  注册是它的一大难点,有点类似于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))
先于构造函数初始化

你可能感兴趣的:(BeeHive总结)