iOS开发底层之NSObject-alloc源码分析-02

Posted iOS_developer_zhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS开发底层之NSObject-alloc源码分析-02相关的知识,希望对你有一定的参考价值。

ios开发底层之NSObject源码分析

探索 Alloc 到底是走的那个源码?

首先先上下alloc与init整体的探索流程图如下:

在这里插入图片描述
有了上面的流程图,我们在结合源码进行探索,就更加清晰了。
关于alloc的核心三步,我在下一篇博客进行展开说明。
待补充。

  1. 通过汇编代码,来查找新建NSobject的时候到底走那部分源码?
  2. 打开汇编的方式,见上篇文章 开发底层之alloc原理初探.
  3. 上代码,通过打断点进入汇编,走下alloc的具体流程。

alloc代码打上断点
汇编展示: 可以很清晰的看到alloc后,下一步走的就是 objc_alloc 方法。
汇编展示

探索为什么alloc会走objc_alloc源码呢?

首先分析NSObject 与自定义NSObject的区别。

  1. NSObject是所有iOS 的基类, 所有自定义的类都集成与他。
  2. MeObject是我继承与NSObject,并重写了alloc方法。

这里首先要弄清楚为什么 Meobject alloc会走两次,两次分别走的流程是怎么样的呢?
这个需要结合objc源码进行调试。

  1. 断点调试,在 MeObject初始化处打上断点, 并在源码 Alloc , Objc_Alloc, callAlloc等地方打上断点。 看看程序运行起来,会怎么跑,具体走哪一步。
  2. 可以看到第一遍的运行过程为:
    1. alloc 会调用Objc_Alloc --> callAlloc 方法的下面 objc_msgSend,表示向系统发送消息
      在这里插入图片描述
    2. 继续执行, alloc–>callAlloc–>_objc_rootAllocWithZone
      得出结论:
      对象走两次alloc的原因是需要去查找sel,以及对应的imp的关系,当前需要查找的是 alloc 的方法编号。

NSobject中的alloc为啥会走到objc_alloc中去?

为了探索这个问题,是需要llvm源码来进行探索的 (llvm-project

  1. 搜索tryEmitSpecializedAllocInit,非常著名的特殊消息发送,在这里也没有找到 objc_alloc直接关联。

  2. 通过alloc字符串搜索,继续查询,如果太多关键字,还可以通过omf_alloc:找到tryGenerateSpecializedMessageSend,表示尝试生成特殊消息发送。
    然后终于发现了。 alloc的踪影
    在这里插入图片描述
    从截图中我们找到了alloc所关联的方法,继续往下查询。 EmitObjcAlloc

  3. 我们跳入进去EmitObjcAlloc方法,看看实现,如果发现了objc_alloc的身影

结论:

     ==NSObject的alloc==会走到==objc_alloc==的源码中,也是iOS系统消息处理逻辑,所以是不会走到==alloc==的源码当中。

NSObject自定义对象alloc 思维流程图如下:

  1. NSObjectalloc源码流程分析。
    NSObject的alloc分析
  2. 自定义对象alloc源码流程分析。
    在这里插入图片描述

以上是关于iOS开发底层之NSObject-alloc源码分析-02的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发底层之RuntimeObjc_msgSend探究 - 08

iOS开发底层之RuntimeObjc_msgSend探究 - 08

iOS开发底层之内存对齐详解-03

iOS底层探索之多线程(十七)——通过 Swift的Foundation源码分析锁(NSLockNSConditionNSRecursiveLock)

iOS开发-Swift进阶之Mirror源码解析!

iOS底层探索之多线程(十五)—@synchronized源码分析