NSObject调用alloc方法为什么不经过alloc方法

一、问题

我的上一篇探索alloc&init底层,探索了对象要是想创建空间,就需要进过objec_alloc->_objc_rootAlloc->callAlloc->_objc_rootAllocWithZone->...具体可以看我上一篇博客。
秉承着程序员“没事找事”的态度,遇到了一个问题,如果我不使用子类创建空间,用ios的基类创建呢?于是就出现了一下情况:在_objc_rootAlloc中打下断点,NSObject创建的alloc没有走进去,这是为什么呢?

未命名.png

二、探索

既然他没有走进去alloc创建的,那么我们可以看看object_alloc创建的,于是发现了它走的是object_alloc,那为什么呢?

未命名.png

三、答案

我们去看看汇编,看看NSObject是怎么个流程,看图我们就可以得知他和子类流程是一样的,所以又断了,那么我们可以在源码中跟一下流程看看情况


03.png

1.跟源码

通过跟源码,我们得知了子类进入这里经过了俩次,从alloc中进入,又进了object_alloc进行发送系统消息,然后又出来了进入alloc方法,而NSObject却不是,他没有经过给系统发送消息的一步,直接开辟内存,所以我们可以猜测,它是在系统编译之后就已经执行了,跟程序员无关,那么又有问题了,为什么子类却要经过俩次呢?

未命名.png

2.解答

在苹果给的llvm文档中,可以得知,任何事物经过alloc之后需要进行对系统发出一个信号,也就是说,搬用llvm中的注释

[self alloc] -> object_alloc(self);
llvm
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容