+ (void)load {
printf("123");
}
这段代码编译完之后,这个函数会储存在Mach-O中的TEXT两个段中,__text存函数二进制,cstring存储字符串 123
要执行printf函数,首先需要访问__text触发一次page In 读入物理内存,为了要打印字符串,还需要访问cstring,还会触发一次page In
有很多同学不了解page In,这里介绍一下,首先先要知道mmap
mmap 的全称是 memory map,是一种内存映射技术,可以把文件映射到虚拟内存的地址空间里,这样就可以像直接操作内存那样来读写文件。
当读取虚拟内存,其对应的文件内容在物理内存中不存在的时候,会触发一个事件: Page In,把对应的文件内容读入物理内存中。
Page In又做了哪些事情呢?
MMU(Memory Management Unit,内存管理单元)找到空闲的物理内存页面
触发磁盘IO,把数据读入到物理内存
如果是TEXT段的页,要进行解密(iOS13之后不需要解密)
对解密后的页,进行签名验证
为了执行这个函数,系统付出了两个page In的代价,所以一旦load方法过多,会影响启动速度
参考:iOS成长之路