OC alloc init 实现原理

探究oc底层必须去苹果开源的网站下载Objc源码
下载大家可以从 此处下载到objc源码 但是下载下来是不能用的。需要进行一系列配置,我个人是从github上面找到的配置好的,避免在上面浪费特别多的时间

image.png

同时也要将这个开关打开,进行汇编层面的分析。
image.png

alloc

首先创建一个OC类,并执行alloc方法

image.png

打断点进入汇编
image.png

由此可以得出oc里面的初始化是由objc_msgsend向类发送alloc消息
他的定义为

objc_msgSend(id 消息接受者,sel 发送消息)

进行发送的从汇编进入objc_msg_send可以输入regiter read

image.png

添加一个 symbol “alloc”断点


image.png

点击下一步 可以看到断点进入了 libobjc.A.dylib


image.png

由此我们查找的文档应该是libobjc,看到跳入的方法为 _objc_rootAlloc

image.png

打开NSObject的c++文件,查看_objc_rootAlloc的方法构成,同时也继续走断点 走入了objc_rootAlloc:


image.png

image.png
image.png

将断点进入 _class_createInstance方法看到,并将断点打到他的返回值的地方


image.png

image.png

由此可见_class_createInstaceFromZone 创建了实例对象


image.png

那么既然alloc已经生成这个对象了为什么还要执行init呢,下面继续分析

init

1

开启进入汇编的模式


image.png

objcmsgsend向Person发送了ini条消息 那个指针是init但是没有标识出来。

电脑太卡了调试不过去总之他就是走到NSObject的init方法


image.png

image.png

image.png

可以看到init方法 将self穿进去然后又将其返回,可以看到他将我们传回去的obj又返回来了,可以看出来他其实什么也没做,苹果这么做的原因是为了让子类重写时可以返回响应的obj做初始化其他的参数。根据自己的需求返回自己想要的obj

总结

objc alloc流程是

  1. 调用alloc方法
  2. objcmsgsend(class,alloc) 调用_objc_rootAlloc
  3. 调用callAlloc
  4. 调用class_createInstance
  5. 调用_class_createInstanceFromZone
  6. 最终得到了响应类型的对象

objc init
init初始化其实是一个_objc_rootInit获得他自身,这样设计的主要原因是可以让子类重写这个方法然后根据需求得到想要的对象

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

相关阅读更多精彩内容

  • 导入 import {Linking} from 'react-native'; 在点击方法里面执行 return...
    以德扶人阅读 8,337评论 0 51
  • 1、眼睛清澈明亮,眼神坚定有力,目光像能够穿透人体,物体一样。道家所谓“碧眼方瞳是神仙”,指的就是这种修炼者中脉打...
    格日乐其其格阅读 12,718评论 4 56
  • 禅舞是什么?禅舞即禅心之舞。它是禅学文化跟舞蹈艺术融为一体的一种修身养性的方法。禅舞是在身心宁静的状态下...
    Mandy曼翎阅读 3,321评论 0 0
  • 等你 今天下午,陪着她们做完眼睛保健操。就背上包准备出发,接到老公的电话。老公在校门在等了好久了...
    11e0cc0f43c1阅读 1,211评论 0 1

友情链接更多精彩内容