1.iOS App启动优化:利用 __attribute__((used, section (“name“)))处理静态协议
attribute是编译属性,用于改变所声明或定义的函数或数据的特性,比如存储特性。attribute中有很多属性,现在我们可以通过 __attribute__((section("name")))编译属性将数据写到可执行文件中,然后在使用的时候,从可执行文件中读取出来。
首先,因为是key-value的形式,我们可以先定义一个结构体:
#define structAppModuleRegister(_class_,_priority_)
然后,使用宏定义一段使用__attribute__((section("name"))) 的代码段:
#define structAppModuleRegister(_key_,_value_)\
__attribute__((used)) static struct ProtocolInfo ProtocolInfo##_key_ \
__attribute__ ((used, section ("__DATA,ProtocolInfoData"))) =\
{\
.key = #_key_,\
.value = #_value_,\
};
used是告诉编译器不用优化掉此函数,即使没有地方使用。ProtocolInfoData 名字可以自定义,除了结构体,char,int 类型也可以使用。这样我们就可以将协议数据写到可执行文件的__DATA 字段中了。
最后,我们需要在使用的时候从可执行文件中读取
2.__attribute__((constructor))/__attribute__((destructor))
构造解析器,修饰的方法可以在main方法前后分别运行,注意的是constructor 和 +load 都是在 main 函数执行前调用,但 +load 比 constructor 更加早一点,因为 dyld(动态链接器,程序的最初起点)在加载 image(可以理解成 Mach-O 文件)时会先通知 objc runtime 去加载其中所有的类,每加载一个类时,它的 +load 随之调用,全部加载完成后,dyld 才会调用这个 image 中所有的 constructor 方法。