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))
先于构造函数初始化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。