iOS-底层原理 04:NSObject的alloc 源码分析

26 篇文章 17 订阅
订阅专栏

iOS 底层原理 文章汇总

主要NSObject中的alloc是与自定义类的alloc源码流程的区别,以及为什么NSObject中的alloc不走源码工程。

在 上一篇文章中分析了alloc的源码,这篇文章是作为对上一篇文章的补充,去探索为什么NSObject的alloc方法不走源码工程。

NSObject的alloc无法进入源码的问题

  • 首先在objc4-781可编译源码中的main函数中增加一个NSObject定义的对象,NSObject 和 LGPersong同时加上断点
    image

  • alloc的源码实现中加一个断点,同时需要暂时关闭断点
    image

  • 运行target,断点断在NSObject部分,打开alloc源码的断点,然后继续执行,会出现以下这种现象
    image

探索Why

【第一步】探索[NSObject alloc]走的是哪步源码

接下来,我们就来探索为什么NSObject的alloc会出现这种情况,首先,

  • 打开Debug --> Debug Workflow --> 勾选 Always Show Disassemly,开启汇编调试

  • 关闭源码的断点,只留main中的断点,重新运行程序,然后通过下图的汇编可以发现NSObject并没有走 alloc源码,而是走的objc_alloc
    image

  • 然后关闭汇编调试,在全局搜索 objc_alloc,在objc_alloc中加一个断点,先暂时关闭,
    image

  • 重新运行进行调试,断住,然后打开objc_alloc的断点,发现会进入objc_alloc的源码实现,此时查看 clsNSObject
    image

【第二步】探索 NSObject 为什么走 objc_alloc?

首先,我们来看看 NSObject 与 LGPerson的区别

  • NSObject 是iOS中的基类,所有自定义的类都需要继承自NSObject
  • LGPerson继承NSObject类的,重写NSObject中的alloc方法

然后根据第一步中汇编的显示,可以看出,NSObjectLGPerson 都调用了objc_alloc,所以这里就有两个疑问

  • 为什么NSObject 调用alloc方法 会走到 objc_alloc 源码?
  • 为什么LGPerson中的alloc走两次?即调用了alloc,进入源码,然后还要走到 objc_alloc
LGPerson中alloc 走两次 的 Why?
  • 首先,需要在源码中调试,在mainLGPerson加断点,断在LGPerson,再在allocobjc_alloccalloc 源码加断点,运行demo,会断在objc_alloc源码中(重新运行前需要暂时关闭源码中的所有断点)
    image

  • 继续运行,发现LGPerson 第一次的alloc会走到 objc_alloc --> callAlloc方法中最下方的objc_msgSend,表示向系统发送消息
    image

  • 继续执行代码,发现会走到 alloc --> callAlloc --> _objc_rootAllocWithZOne,也就是 iOS-底层原理 02:alloc & init & new 源码分析源码分析中的alloc流程.

以下是第二次走到calloc方法中的调用堆栈情况
image

所以由上述调试过程可以得出,LGPerson两次的原因是首先需要去查找sel,以及对应的imp的关系,当前需要查找的是 alloc 的方法编号,但是为什么会找到objc_alloc?这个就需要问系统了,肯定是系统在底层做了一些操作。请接着往下看

NSObject中alloc 走到 objc_alloc 的 why?

这部分需要通过 LLVM源码(即llvm-project) 来分析

准备工作:首先需要一份llvm源码

  • 在llvm源码中搜索objc_alloc
    image

  • 搜索shouldUseRuntimeFunctionForCombinedAllocInit,表示版本控制
    image

  • 搜索tryEmitSpecializedAllocInit,非常著名的特殊消息发送,在这里也没有找到 objc_alloc
    image

  • 继续尝试,开启上帝视角,通过alloc字符串搜索,如果还找不到,还可以通过omf_alloc:找到tryGenerateSpecializedMessageSend,表示尝试生成特殊消息发送
    image
    然后在这个case中可以找到调用alloc,转而调用了objc_objc的逻辑,其中的关键代码是EmitObjCAlloc
    image

  • 跳转至EmitObjCAlloc的定义可以看到alloc 的处理是调用了 objc_alloc
    image

由此可以得出 NSObject中的alloc 会走到 objc_alloc,其实这部分是由系统级别的消息处理逻辑,所以NSObject的初始化是由系统完成的,因此也不会走到alloc的源码工程中

总结

总结下NSObject中alloc 和自定义类中alloc的调用流程

NSObject
NSObject alloc源码流程

自定义类

自定义类 alloc源码流程

iOS之深入解析alloc、init与new的底层原理
╰つ栺尖篴夢ゞ
09-01 3万+
底层探索 一、对于iOS底层原理探索一般有三个方法实现 汇编分析 LLDB调试 源码分析 二、作为 iOS 开发者,需要关注的应该就是从应用启动到应用被 kill 掉这一整个生命周期的内容。不妨从最熟悉的 main 函数开始,一般来说,在 main.m 文件中打一个断点,左侧的调用堆栈视图应该如下图所示: 三、调用堆栈有两个注意点: 需要关闭 Xcode 左侧 Debug 区域最下面的 show only stack frames with debug symbols and between li
iOS底层】05:类原理分析(下)
miaocuilin的专栏
06-25 448
目录 回顾: 一、属性、成员变量、实例变量的区别 二、sel&imp 编码表补充 三、setter方法底层原理 四、类方法存储API方式解析 五、isKindOfClass面试题分析 六、总结 回顾: .objc_objectobjc_class是继承关系,class继承自object。 .像person和NSObject,person和objc_object没有继承等关系,只是一个上层,一个底层,然后NSObject是按照objc_class的模板创建的。 .id 是
NSObject源码.zip
07-30
NSObject源码
IOS底层原理(一)OC对象alloc原理
kyl282889543的博客
01-21 382
IOS底层原理(一)OC对象alloc原理
iOS开发-NSObjectalloc函数执行
CaicaiNo.1
05-10 424
文章目录前言流程callAllocallocWithZone对流程的影响_class_createInstanceFromZone方法init和new 前言 探索下alloc的方法执行流程 debug来调试runtime源码,执行以下逻辑: NSObject *objc1 = [[NSObject alloc] init]; id __weak objc2 = objc1; id __weak objc3 = objc2; 流程 callAlloc 调用 callAlloc // Calls [cls a
手撕 iOS 底层03 -- NSObjectalloc分析
iOS__ming的博客
11-27 222
手撕 iOS 底层03 – NSObjectalloc分析 通过实践得知, NSObject *objc = [NSObject alloc];这行代码是不会直接走alloc方法里的, 这也就和我们之前探索的自定义类alloc流程有区别?所以这一章分析NSObjectalloc和自定义类的alloc有什么区别? 0x00 – objc_alloc 在断点处,点击Debug --> Debug Workflow --> Always Show Disassembly; 通过汇编调试得知:
NSObject *obj = [[NSObject alloc] init] 引发的一二事儿
weixin_34185560的博客
08-03 418
本文是为了准备在实习公司新人串讲中部分内容的草稿,主要介绍一些 Objective-C 和 iOS 基础的东西,纯属抛砖引玉~ Objective-C 基础 接下来跟大家分享一下 Objective-C 和 iOS 开发的基础内容,而且主要会围绕一句普通的代码进行展开: NSObject *obj = [[NSObject alloc] init]; 复制代码其实这部分内容大都是我自己对这行代...
iOS底层原理 - alloc & init & new 详解
最新发布
yinshipin007的博客
03-20 315
一般在开发中,初始化除了init,还可以使用new,两者本质上并没有什么区别,以下是objc中new的源码实现,通过源码可以得知,new函数中直接调用了callAlloc函数(即alloc分析的函数),且调用了init函数,所以可以得出new 其实就等价于 [[Person alloc] init]的结论。接下来我们分别看一下这三个函数。★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。
iOS 底层原理-alloc流程
qq_37713953的博客
06-23 460
一.了解对象与指针 先看一张图: 这张图我们可知: imgv是指针,指针指向的是对象; [JPeople alloc]创建了一个对象; p1写在等号前面,等于把P1指向了那个对象的内存地址,所以p1是指针; 同理可知p2,p3也是指针,指向了P1指向了那个对象的同一块内存地址; 所以我们都是通过通过这个指针找到内存中的对象(通过指针来找到对象而不是表示对象) 二.底层探索的三种方式 2.1 下断点方式 按着control + in 进入真机调试(模拟器是x86架构,真机是arm64架构): in这
iOS --- Blocks底层原理详解(三)
genzld的博客
12-03 239
在这篇文章中(https://blog.csdn.net/genzld/article/details/103338243),已经介绍了block的底层本质实现以及了解变量的捕获,本文继续探寻block的本质 block对 对象变量 的捕获 block一般在使用过程中都是对对象变量进行捕获,那么对象变量的捕获和基本数据类型变量相同吗? 查看以下代码思考:当block中访问的...
iOS NSObject源代码(1)alloc和init
QQQ274628593的博客
11-03 832
iOS 内存基本的知识这里就不讲了,有太多资料,这里主要是说明我对内存这一块的个人理解。 OC对象有四种状态: (1)创建并持有对象:alloc init (2)持有对象:retain、copy (3)释放对象:release (4)废弃对象:dealloc 1.Alloc、init 首先看下alloc和init,这两个方法都是NSObject里面的,首先看下苹果官方源代码objc4
NSObject源码
qskycolor的专栏
06-16 1703
/* NSObject.h Copyright (c) 1994-2012, Apple Inc. All rights reserved. */ #ifndef _OBJC_NSOBJECT_H_ #define _OBJC_NSOBJECT_H_ #if __OBJC__ #include #include @class NSString,
NSObject 中 isa 指针源码解读
狼族小子的专栏
06-22 696
oc runtime源码 版本 objc4-723 先来一段大家都知道的知识 NSObject类在程序运行,会有多个实例对象,一个类对象,一个元类对象。 其中所有实例对象中的isa指针指向类对象,类对象中的isa指针指向元类对象。NSObject 的元类对象指向自己,其他元类对象指向 NSObject 的元类对象 OC 对象都是 C 语言的结构体,所有的对象都包含一个类型为 isa_t...
Objective-C NSObject 的实现分析(2014-10-23更新)
晓月的专栏
07-25 8855
iOSNSObject 类没有开源, 但是呢 runtime开源了,里面有个类 Object 看接口和NSObject差不多,下面我就对着 Object 的代码来分析NSObject
ios开发 之 NSObject详解
热门推荐
曾治铭的博客
04-18 1万+
NSObject是大部分Objective-C类继承体系的根类。这个类遵循NSObject协议, 提供了一些通用的方法,对象通过继承NSObject,可以从其中继承访问运行时的接口,并让对象具备Objective-C对象的基本能力。下面我们就详细的介绍NSObject
iOS底层原理探究- NSObject 所占内存
weixin_34174322的博客
06-02 211
iOS底层原理探究- NSObject 所占内存 面向对象的Objective-C 我们平时写的 OC 代码底层实现为 C/C++ 代码,因为 Runtime 让 OC 具备了面向对象的特点,而后底层的 C/C++ 会转换成底层的 汇编 代码,最终被被解析成计算机能识别的 机器语言 。而 OC 中的类,正是正是基于 C/C++ 的结构体实现的。我们可以通过 clang 命令将我们平时所写的 ...
NSObject Class 浅析
weixin_34384557的博客
07-31 193
Objective-C中有两个NSObject,一个是NSObject类,另一个是NSObject协议。而其中NSObject类采用了NSObject协议。在本文中,我们主要整理一下NSObject类的使用。 说到NSObject类,写Objective-C的人都应该知道它。它是大部分Objective-C类继承体系的根类。这个类提供了一些通用的方法,对象通过继承NSObject,可以从其中继承...
iOS 底层原理03:objc4-781 源码编译 & 调试
lin1109221208的博客
09-06 1872
iOS-底层原理 01:源码探索的三种方式 iOS-底层原理 02:alloc & init & new 源码分析 iOS 底层原理03:objc4-781 源码编译 & 调试 本文主要是通过将objc4-781的源码编译成功,然后在源码中进行调试,便于跟踪方法的底层实现流程 准备工作 环境版本 & 最新objc源码 mac OS 10.15 Xcode 11.4 objc4-781 依赖文件下载 需要下载以下依赖文件 其中除了其中 launchd-106.10 .
iOS 底层原理 文章汇总
lin1109221208的博客
09-07 1602
objc4 源码相关 iOS-底层原理 01:源码探索的三种方式 iOS-底层原理 02:alloc & init & new 源码分析 iOS-底层原理 03:objc4-781 源码编译 & 调试
深入解析iOS NSObject:对象本质、内存分配与源码分析
这篇文档通过源码解析和实例分析,详细介绍了iOSNSObject对象的底层工作原理,对理解Objective-C的内存管理机制和类继承体系有极大的帮助。读者可以通过学习这些内容,提升对iOS系统和Objective-C编程的深入理解。
写文章

热门文章

  • 如何在Swift开发中使用CocoaPods导入的第三方库 10700
  • iOS开发之拆分数组 10371
  • IOS cocoapods镜像源更新 9807
  • VMware 安装Mac OS 10.13系统 8707
  • 十一、理解纹理坐标 7305

分类专栏

  • OpenGL ES 21篇
  • iOS底层原理 26篇
  • Metal 10篇
  • OpenGL 30篇
  • 数据结构与算法 2篇
  • Runtime 9篇
  • RunLoop 3篇
  • Flutter 5篇
  • 排序 10篇
  • iOS开发 28篇
  • Swift 34篇
  • 环境配置 8篇
  • RN
  • 设计模式 4篇
  • 测试 8篇

最新评论

  • 四、深入剖析【离屏渲染】原理

    流岚明月: 在正常的渲染流程中,我们是无法做到对所有图层进行圆角裁剪的。这句话不太理解,我取出来的时候,放进去之前都做圆角处理不行吗?

  • Mac OpenGL 环境搭建

    Focus_on__: 怎么在那个Header Search Paths里添加路径啊,为什么我的点开只有debug和release

  • iOS 底层原理03:objc4-781 源码编译 & 调试

    共赢之家: ios底层改码,可以的联系。。

  • 十一、理解纹理坐标

    m0_45695898: 好像有点理解,谢谢博主

  • Swift Callkit扩展--来电标记

    清水兮: 可以检测当前来电吗

大家在看

  • 数据结构与算法分析:你真的理解排序算法吗——插入算法(万字长文+代码详解) 2

最新文章

  • iOS-底层原理 25:多线程原理
  • iOS-底层原理 24:内存五大区
  • iOS-底层原理 23:KVO 底层原理
2020年114篇
2019年89篇
2018年2篇
2016年12篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家清远卡通玻璃钢动物雕塑深圳达州玻璃钢雕塑摆件施工厂家盐城城市玻璃钢雕塑价格山西佛像玻璃钢雕塑供应商四川季节性商场美陈供应商场美陈公司武汉玻璃钢雕塑艺术品河南玻璃钢卡通雕塑草莓报价商场dp景点美陈装饰男装辽宁商场创意商业美陈定制西安弘昌弘陕西玻璃钢雕塑厂家襄阳动物玻璃钢雕塑制作上海商场美陈怎么样公园玻璃钢雕塑售价广东玻璃钢米奇卡通雕塑金山区小型玻璃钢雕塑推荐浙江大型商场美陈销售公司嘉兴商场开业美陈商场用拖鞋做美陈甘南仿真玻璃钢雕塑装饰商场美陈市场报价沧州玻璃钢雕塑厂商定制广东季节性商场美陈市场公园玻璃钢卡通雕塑源头好货玻璃钢雕塑模型厂家河北唐县工艺玻璃钢雕塑推荐货源玻璃钢雕塑 和树脂雕塑玻璃钢雕塑品制作工艺菏泽价值观玻璃钢人物雕塑上海超市商场美陈供应香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化