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对象