iOS开发之alloc底层探索之旅

Posted 卡卡西Sensei

tags:

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

写在前面

现在的ios市场环境,今日不同往日了,出去面试,面试官问的问题已经不单单停留在UI层了,都是往底层去考验面试者的能力了。动不动就是左一个底层,又一个底层的问,大部分人都是一问三不知,非常的懵逼!面试往往都是以失败告终,那么今天我们就来好好的探索一下底层。

我们的每一个程序的界面的开始基本上都是从实例化一个对象开始的,都在alloc,init。那么在OC的底层,到底做了些什么操作呢?今天我们就好好的来探索探索alloc底层的工作流程。

1.抛砖引玉

首先看看下面的代码

    JPStudent *s1 = [JPStudent alloc];
	JPStudent *s2 = [s1 init];
	JPStudent *s3 = [s1 init];

	NSLog(@"%@-%p-%p",s1,s1,&s1);
	NSLog(@"%@-%p-%p",s2,s2,&s2);
	NSLog(@"%@-%p-%p",s3,s3,&s3);

打印结果

<JPStudent: 0x600002d583e0>-0x600002d583e0-0x7ffee6343098
<JPStudent: 0x600002d583e0>-0x600002d583e0-0x7ffee6343090
<JPStudent: 0x600002d583e0>-0x600002d583e0-0x7ffee6343088

从上面打印的内容结果分析来看,s1/s2/s3 对象的地址是一样的,但是指针的地址是不一样的。是因为alloc开辟一块内存,而init只是这个类的构造方法,并没有开辟内存的功能,所以三个对象的地址都指向了同一个内存地址空间。为了方便大家理解,我画了下面👇这张图

 

2.开始探索之旅

2.1底层调试的三种方式

  1. 断点调试跟踪
  2. 符号断点跟踪调试
  3. 汇编跟踪

1.断点调试

在实例化对象的地方打上断点,待断点走到这里,然后按住control键+step into 单步执行

 单步调试可以看到,我们的底层是objc_alloc

2.符号断点

步骤1.

 

设置符号断点

步骤2 下符号断点

下符号断点

 

这时候运行程序,会定位到相应的符号断点处

3.汇编跟踪

单步调试,会走到汇编代码里面

2.2开启源码探索之旅

我们想去看看alloc的实现,点进去走到这里就走不下去了,这就尴尬了,想深入的了解下,却无从下手了😂,这该怎么办呢???

这是因为这里的具体实现的方法没有暴露出来,我们可以去苹果的开源网站去看看,找下开源的源码,试试看能不能找到答案?

源码地址在这里👉Apple Open Source,去这里看更直接一点,有了源码我们就可以更深入的去底层探索一番了。

 从上面的官网截图,我们可以看到苹果开源了很多的源码,苹果还是可以的嘛!开放了这么多的源码,供苹果的开发人员学习。那我们该找哪一个源码来探索alloc的工作流程呢?

上面👆介绍了三种底层探索调试的方法,我们已经知道了我们要找的是objc_alloc,所以我们在开源的官网界面搜索一下

 对了,就是这个objc4里面

在这里有苹果每次更新的版本,我们应该尽量找最新的源码来探索学习。

我们今天要讲的是818.2的版本,因为我电脑上已经有了这个版本配置编译好的了工程代码,这里就不详细介绍源码配置编译的过程了😝,有空会出一期教程的😁。

那么我们就开始一步一步开始探索alloc吧!

。。。。。。未完待续,要知后续如何,请听下回分解

🌹请收藏+关注,评论 + 转发,以免你下次找不到我,哈哈😁🌹

 

 

 

 

以上是关于iOS开发之alloc底层探索之旅的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发底层之alloc原理初探

iOS开发底层之RuntimeObjc_msgSend探究 - 08

iOS开发底层之RuntimeObjc_msgSend探究 - 08

iOS底层探索之类的结构(上)

iOS开发之结构体底层探索

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