From: https://juejin.cn/post/6844904133074370573
部分源码的下载地址集合
alloc 方法流程
要解析alloc方法,首先在代码里打下断点
然后我们通过debug > Debug Workflow > Always Show Disassembly 查看其实现
在 viewDidLoad
方法中,[TTObject alloc]
这个方法其实是调用了objc_alloc
,通过对下符号断点发现objc_alloc
存在libobjc.A.dyilb
库中。
找到objc_alloc
函数的实现,我们可以看到alloc
相关的方法,其实都调用了一个callAlloc()
函数
进入callAlloc()
函数会执行到 __OBJC2__
部分。因为canAllFast()
返回值总为false
,所以代码会走到判断中的else
部分。重点就在于class_createInstance()
函数。
class_createInstance()
内部实际是调用了_class_createInstanceFromZone
函数。在这个函数里我们可以看到会对obj
进行开辟空间以及初始化isa
的操作
在处理空间大小时,会通word_align
对obj
进行8字节对齐处理
初始化isa
,最重要的就是对cls / shiftcls
的处理。
在isa
处理完成并放入obj
中,alloc
方法算是告一段落了。我们也可以通过指针获取到对象。
init 方法流程
查看源码发现init
方法什么都没有做。那么init方法为什么存在呢?就是apple留给开发者的一个处理入口,初始化对象以后对其进行自定义的修改。
执行结果
都是同一个TTObject对象