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