前言
上一篇长我们_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 mapped
load_images
=_dyld_objc_notify_init init
unmap_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
=sNotifyObjCMapped
load_images
=init
=sNotifyObjCInit
sNotifyObjCMapped
和 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()
函数
补充
map_images
->关键的一些数据
- 1.类的加载-协议-属性
ro
–rw
慢速流程-懒加载-非懒加载 - 2.
map_images
在什么时候调用 - 3.
load_images
()load方法+cxx + main - 4.
dyld
->main
- 5.上一阶段的考试分析
- 6.视频
wwdc2017 dyld2 VS dyld3