__attribute__特性在iOS中的应用

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 方法。

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

推荐阅读更多精彩内容