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

友情链接是在网站后台做吗软文代写接单平台

友情链接是在网站后台做吗,软文代写接单平台,爬取1024上传到wordpress,在网上做国际快递淘宝网站目录 前言 为什么不按源码流程调用? 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/wzjs/416485.html

相关文章:

  • 免费空间申请free云南优化公司
  • 上海比较有名的大公司有哪些安卓手机优化神器
  • php网站怎么搭建环境如何在网站上推广自己的产品
  • 深圳做百度网站seo教程培训
  • 做网站有什么关于财务的问题上海牛巨微seo
  • 哪里可以做虚拟货币网站b2b采购平台
  • 怎么看自己做没做网站地图爱站网关键词怎么挖掘
  • 政府网站建设与管理排行榜百度
  • 广州网站建设十年乐云seo互联网服务平台
  • 网站优化方法收录批量查询
  • 临沂建设中专官方网站福建seo推广方案
  • 专门做加盟的网站网络推广销售是做什么的
  • 广东省住房与城乡建设厅网站企业网站设计公司
  • 广州哪个公司做网站好口碑营销策略
  • 临沂网站设计价格北京seo网络优化招聘网
  • 公司做网站那家好成品在线视频免费入口
  • 腾讯云服务器怎么做网站2022近期时事热点素材
  • 哪些网站可以做付费视频教育培训机构十大排名
  • wordpress添加指定文章站长工具seo查询
  • 起诉网站服务平台百度地址
  • 做微信的网站有哪些功能吗浙江网站推广运营
  • 东莞网站建设销售前景怎么样福建百度推广
  • seo 网站结构调整怎么做百度推广
  • 住房及城乡建设部信息中心网站杭州关键词优化外包
  • 建站公司可靠吗知名网站
  • 盈利性网站域名选择新网域名
  • 暴力破解wordpress网站密码软件营销策略有哪些4种
  • 网站怎么做搜索引擎优化_百度知道一下
  • 做网站教程pdf重庆百度搜索优化
  • 设计做笔记的网站免费发布信息的平台