当前位置: 首页 > news >正文

湖南网站推广公司南昌网站建设托管

湖南网站推广公司,南昌网站建设托管,短网址api接口,抚宁建设局网站目录 前言 为什么不按源码流程调用? alloc的调用流程 前言 在之前的博客中我们有学习到过alloc的底层原理,沿着源码一步步找到了alloc的调用链——alloc—>_objc_rootAlloc—>callAlloc—>_objc_rootAllocWithZone—>_class_createInstan…

目录

前言

为什么不按源码流程调用?

alloc的调用流程


前言

在之前的博客中我们有学习到过alloc的底层原理,沿着源码一步步找到了alloc的调用链——alloc—>_objc_rootAlloc—>callAlloc—>_objc_rootAllocWithZone—>_class_createInstanceFromZone,但其实在实际的alloc过程中,并不是这个调用流程,如果对NSObject的alloc加上断点调试就会发现,alloc流程并没有进入源码,接下来我们来探究一下为什么会这样以及真实的调用流程。

为什么不按源码流程调用?

在实际运行中,[NSObject alloc][MyClass alloc] 这类调用通常不会真正进入 libobjc 的源码层(比如 _objc_rootAlloc,而是走了更加高效的底层路径,这是由于 Apple 对运行时做了大量优化(比如汇编级别快速路径、ISA-optimized fast path)来避免频繁进入 C 层函数。

1.对于非NSObject类, objc_msgSend是汇编函数,非普通 C 函数

  • 它大多数时候在汇编层 直接查找 IMP 并跳转执行,不会进入 Objective-C runtime 的 C 函数实现。

  • 也就是说,objc_msgSend(obj, @selector(alloc)) 通常直接跳到了元类中的 +alloc 的 IMP。(这里涉及到后面cache_t的方法缓存,如果命中了Cache,就不会走完整的流程)

  1. 对于NSObject, 是基础类,系统做了特殊优化

  • 对于 NSObject和一些常见类,Apple 使用了 汇编级别的 fast path,这意味着即便你打断点试图进入 _objc_rootAlloc,你可能根本进不去。

  • 常见的“未命中源码”的情况说明使用的是缓存或特殊入口。

alloc的调用流程

通过调用alloc后的堆栈详情我们就可以发现,无论是NSObject类还是自定义类,调用alloc方法最开始走的都是objc_alloc而不是objc_rootAlloc。这是因为消息转发时系统在底层帮我们转发到了objc_alloc。我们来看看objc_alloc的源码实现

可以发现其实他和objc_rootAlloc的实现是一样的,调用callAlloc。

回顾之前callAlloc的实现

可以看到callAlloc中分为几个分支来处理

对于NSObjcet类,初始化在llvm编译时就已经初始化好了,因此缓存中已经有alloc/allocWithZone方法了,hasCustomAWZ()为false,那么!cls->ISA()->hasCustomAWZ()就为true。

因此NSObjcet在此时会进入_objc_rootAllocWithZone并调用_class_createInstanceFromZone,后面的步骤就和之前说的一样了,这就是为什么NSObjct没有走alloc方法

而对于自定义类,初次创建时没有默认的alloc/allocWithZone实现,所以继续向下执行进入到消息发送流程,消息转发时会向父类找,最终找到NSObjcet的alloc并调用,即[NSObjcet alloc],这时会来到_objc_rootAlloc,进入后再次调用callAlloc,这次调用的是NSObject类的,缓存中存在alloc/allocWithZone实现,就接着走_objc_rootAllocWithZone方法,后面步骤也就和之前一样了。所以自定义类在调用alloc时会走两次callAlloc

总结一下,NSObjcet的调用链如下图:

自定义类的调用链如下图:

http://www.dtcms.com/a/476213.html

相关文章:

  • 诛仙2官方网站西施任务怎么做福建省建设工程执业注册管理中心网站
  • 为什么自己做的网站打开是乱码百度服务平台
  • 北京网站设计济南兴田德润评价网站开发程序员的工资是多少
  • 供需平台类网站建设画册做的比较好的网站
  • 网站网站开发需要多少钱asp网站数据库位置
  • 电子政务门户网站建设的意义wordpress如何给指定位置添加代码
  • 2021外贸网站有哪些网址导航app大全
  • 网站建设涉及的知识产权国家拨款农村建设查询的网站
  • 名字找备案网站网站多大够用
  • 绵阳网站建设制作网站主页布局
  • 网站seo诊断报告怎么写做箱包关注哪个网站
  • 深圳做电商平台网站抚州的电子商务网站建设公司
  • 广东广州电脑个人建站外贸平台有哪些分别对应哪个市场
  • 网站建设公司固定ip有什么网站做交流会
  • 海口装饰设计网站建设分销平台门店端
  • 桂林技术交流站js页面下载wordpress
  • 深圳网站关键词排名优化网站表单模板
  • wordpress模板仿遮天小说站商城网站制作深圳网站制作
  • 网站建设投标文件范本一键生成动漫视频的软件
  • 佛山电商网站制作营销型网站是啥意思
  • 网站建设收费情况公司网站建设 费用
  • 网站建设读书笔记怎样做才能让网站有排名
  • 网站图片大小多少合适wordpress精美博客主题
  • 刚做的网站在百度上搜不到中国外发加工网官网
  • 表白网站制作图片网站 代码
  • 天津网站优化步骤网站开发有哪些课程
  • 色彩搭配 网站网页设计的基本原则有哪些
  • layui响应式网站开发教程网络推广哪家好
  • 网站要懂代码转做海外买手的网站
  • 个人做网站设计网络科技公司怎么挣钱