前言
上一篇长我们_dyld_objc_notify_register这个方法我们没有细节分析 这节我们我们主要分析一下这个流程
1.dyld链接objc的函数执
我们在objc4-818.2代码里面执行_objc_init函数里面执行_dyld_objc_notify_register(&map_images, load_images, unmap_image);
如图所示:
&map_images=_dyld_objc_notify_mapped mappedload_images=_dyld_objc_notify_init initunmap_image=_dyld_objc_notify_unmapped unmapped
而发现在objc4-818.2代码里面找不到_dyld_objc_notify_register这个函数的实现 通过dyld源码发现可以查询到_dyld_objc_notify_register这个函数的实现如下图
_dyld_objc_notify_register的实现有dyld3 和 dyld2两种 我们这里分析的是 dyld2 为什么呢。因为我们设置断点调试发现是走的dyld2
那么这个_dyld_objc_notify_register map_images和load_images 在什么时候调用的呢
map_images=mapped=sNotifyObjCMappedload_images=init=sNotifyObjCInitsNotifyObjCMapped和sNotifyObjCInit在什么时候调用
sNotifyObjCMapped在什么时候调用 我们发现有一个notifyBatchPartial执行
sNotifyObjCInit在什么时候调用呢 我们发现在notifySingle调用
notifySingle在什么时候调用呢 我们发现在recursiveInitialization调用
map_images会调用
会调用 map_images_nolock
load_images的方法调用
prepare_load_methods的方法调用
call_load_methods的load的方法调用 优先[ViewController load]的方法
其次 __attribute__((constructor)) void kcFunc() 调用这个方法
2.dyld to main()函数
最后
jmp跳转main()函数
补充
真机运行调用的是dyld3的方法
map_images->关键的一些数据
- 1.类的加载-协议-属性
ro-rw慢速流程-懒加载-非懒加载 - 2.
map_images在什么时候调用 - 3.
load_images()load方法+cxx + main - 4.
dyld->main - 5.上一阶段的考试分析
- 6.视频
wwdc2017 dyld2 VS dyld3