一、问题
我的上一篇探索alloc&init底层,探索了对象要是想创建空间,就需要进过objec_alloc
->_objc_rootAlloc
->callAlloc
->_objc_rootAllocWithZone
->...具体可以看我上一篇博客。
秉承着程序员“没事找事”的态度,遇到了一个问题,如果我不使用子类创建空间,用ios的基类创建呢?于是就出现了一下情况:在_objc_rootAlloc
中打下断点,NSObject创建的alloc没有走进去,这是为什么呢?
二、探索
既然他没有走进去alloc
创建的,那么我们可以看看object_alloc
创建的,于是发现了它走的是object_alloc
,那为什么呢?
三、答案
我们去看看汇编,看看NSObject是怎么个流程,看图我们就可以得知他和子类流程是一样的,所以又断了,那么我们可以在源码中跟一下流程看看情况
1.跟源码
通过跟源码,我们得知了子类进入这里经过了俩次,从alloc
中进入,又进了object_alloc
进行发送系统消息,然后又出来了进入alloc
方法,而NSObject却不是,他没有经过给系统发送消息的一步,直接开辟内存,所以我们可以猜测,它是在系统编译之后就已经执行了,跟程序员无关,那么又有问题了,为什么子类却要经过俩次呢?
2.解答
在苹果给的llvm文档中,可以得知,任何事物经过alloc之后需要进行对系统发出一个信号,也就是说,搬用llvm中的注释
[self alloc] -> object_alloc(self);