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

做城市网站的标语广东短视频seo搜索哪家好

做城市网站的标语,广东短视频seo搜索哪家好,设计工作室需要资质吗,软件技术发展前景与趋势文章目录 前言问题发现探索NSObject的alloc源码实现流程探索NSObject为什么直接走objc_alloc,而GGObject先走alloc总结 前言 前面笔者已经学习了alloc相关源码,之前的alloc底层源码实现步骤是以GGObject为基础的,今天我们来探索一下NSObject中…

文章目录

  • 前言
  • 问题发现
  • 探索NSObject的alloc源码实现流程
  • 探索NSObject为什么直接走objc_alloc,而GGObject先走alloc
  • 总结

前言

  前面笔者已经学习了alloc相关源码,之前的alloc底层源码实现步骤是以GGObject为基础的,今天我们来探索一下NSObject中的alloc源码。

问题发现

  我们在GGObject前面添加NSObject类的alloc代码,然后对NSObject和GGObject都添加断点。
请添加图片描述
  按住command点击进入alloc的实现源码后也添加断点,但是先不要开启断点,运行代码等到NSObject的断点后再开启这里的断点。
请添加图片描述
  打开这里的断点后,我们回到main文件,开始断点调试,点击conutine后我们发现,断点直接到了GGObject,这就意味着NSObject的alloc没有走我们上面添加的alloc断点处。这是为什么呢?而NSObject的alloc方法又走的哪里呢?

探索NSObject的alloc源码实现流程

  首先,我们打开项目上面的Debug->Debug Workflow->Always Show Disassembly,进入汇编调试。

请添加图片描述

  然后我们能看到这样的汇编代码:

请添加图片描述

  通过上述汇编代码,我们可以看出来NSObject和GGObject都会走objc_alloc。而GGObject在走objc_alloc之前,会先走alloc,NSObject则会直接走obj_alloc,那我们现在关闭汇编调试,全局搜索objc_alloc,试着在objc_alloc上打断点重新进行调试(同样在运行代码后打开断点),以此来验证我们的想法。
这里笔者还有一个疑问就是:为什么NSObject和GGObject这里的汇编代码都显示的是obj_alloc?
请添加图片描述

  运行代码打开断点,点击continue后,发现断点进入了objc_alloc源码。

请添加图片描述
  此时鼠标放在cls上,发现其属于NSObject类。
请添加图片描述

探索NSObject为什么直接走objc_alloc,而GGObject先走alloc

  首先,我们先了解一下alloc方法的本质:所有 Objective-C 类的 alloc 方法最终都会调用 objc_alloc,这是 Runtime 的底层内存分配函数。
​​所以,无论是 NSObject 还是 GGObject,它们的 alloc 方法最终都会走到 objc_alloc。那么,alloc与obj_alloc到底是什么关系?

alloc 是 Objective-C 方法​​,定义在 NSObject 中(所有类继承自 NSObject)。
​​objc_alloc 是 Runtime 的底层 C 函数​​,实际完成内存分配。

示例如下:
  当调用 [MyClass alloc] 时,动态派发会找到 MyClass 的 alloc 方法,最终调用 objc_alloc。

// 高级代码
MyClass *obj = [MyClass alloc]; 
// 底层等价于
MyClass *obj = objc_alloc(MyClass.class);

  现在我们就可以来讨论上面调试汇编代码时候的那个问题了:为什么NSObject和GGObject这里的汇编代码都显示的是obj_alloc?

在汇编中,alloc 方法的实现可能被内联或直接跳转到 objc_alloc(尤其是对于根类 NSObject)。但对于子类 GGObject而言,如果未重写 alloc 方法,仍然会调用父类(NSObject)的 alloc,最终走到 objc_alloc。
在我们刚刚的汇编代码中,NSObject 和 GGObject 的实例分配都通过 bl 0x100003f14 调用了 objc_alloc,这说明它们的 alloc 方法最终都指向了同一个 Runtime 函数。​​这恰好符合我们刚刚对alloc方法本质的认识,因为所有类的 alloc 方法最终都会调用 objc_alloc。

了解以上原理后,我们再实际调试一下:
先在main中GGPerson加断点,断在GGPerson,再在alloc 、 objc_alloc 和 calloc 源码加断点,运行demo,会断在objc_alloc源码中(重新运行前需要暂时关闭源码中的所有断点)
在这里插入图片描述
继续运行,发现LGPerson 第一次的alloc会走到 objc_alloc --> callAlloc方法中最下方的objc_msgSend,表示向系统发送消息。
请添加图片描述
继续执行代码,发现会走到 alloc --> callAlloc --> _objc_rootAllocWithZOne,也就是笔者上一篇博客【iOS】OC源码阅读——alloc源码分析中的alloc实现流程。

总结

  通过探寻NSObject和GGObject(即NSObject的子类)alloc实现流程的不同,我们知道了所有 Objective-C 类的 alloc 方法最终都会调用 objc_alloc,这是 Runtime 的底层内存分配函数,也明白了alloc与obj_alloc的关系。文章中的某些地方,具体细节(如alloc和obj_alloc的关系底层代码体现等)可参考:iOS-底层原理 04:NSObject的alloc 源码分析

在这里插入图片描述

在这里插入图片描述

http://www.dtcms.com/wzjs/50807.html

相关文章:

  • 动易6.8网站头宁波seo快速优化教程
  • 做静态页面的网站怎样把产品放到网上销售
  • 手机网站解决方案网络科技
  • 我要在附近找工作sem优化策略
  • 2014苏州建设银行招聘网站免费网站怎么做出来的
  • 网站建设流程表全媒体广告代理加盟
  • 临沂做网站价格seo网站推广招聘
  • 网站核查怎么抽查怎么弄推广广告
  • magento网站开发公司页面设计
  • wordpress多久学会东莞企业网站排名优化
  • 网站建设服务器介绍图片网络营销成功案例介绍
  • 鞍山做网站团队怎样在网上推广自己的产品
  • 青岛做门户网站公司推广关键词排名方法
  • 做网站开发要安装哪些软件2022年可以打开的网址
  • 口腔医院网站建设企业网站设计价格
  • 企业如何在自己的网站上做宣传seo外包网站
  • 广告去哪个网站做微信社群营销怎么做
  • 天津网站优化公司哪家专业win优化大师有免费版吗
  • b2b的典型网站整合营销推广
  • 丰台网站建设报价杭州网站运营十年乐云seo
  • 通辽做网站制作公司济南seo关键词排名工具
  • 广州商城网站建设seo的中文意思是什么
  • 怎么做属于自己的领券网站上海网络推广外包
  • 做网站软件是什么下载网站制作和推广
  • 建网站教程视频下载百度不收录网站怎么办
  • 做网站职校选什么专业友情链接怎么连
  • 网站开发安装win10家庭版网站优化的方法与技巧
  • 网站开发与实现测试用例网络宣传
  • 使用net域名的大网站百度排名怎么做
  • 阿里云备案增加网站做网站多少钱