OC---alloc底层探索

2020-09-06  本文已影响0人  疯狂一生

iOS的开发人员都知道,我们创建一个新的对象的时候,都会用到alloc、init等方法,但是具体alloc是如何创建对象的,它的流程是如何的,我们一般都没做过深入的了解,现在我们就一起探索一下:

一、 如何查看alloc底层代码运行代码

第一种方法:通过摁住control - step into

![在这里插入图片描述](https://img-blog.csdnimg.cn/2020090618465156.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzMwOTYzNTg5,size_16,color_FFFFFF,t_70#pic_center)

1

第二种方法: 符号断点查看源码出处

第三种方法: 汇编查看跟流程

二、 在源码库中去找alloc的执行步骤

源码库下载

在源码库中找到objc4-781这个库,这个事现在最新的库:

然后在这个库中去查看alloc是如何起作用的。

三、alloc 流程图:

alloc 的核心方法:

cls->instanceSize : 先计算出所需要的内存空间的大小

calloc : 向系统申请开辟内存,返回地址指针

obj->initInstanceIsa : 关联到相关的类

注:16字节对齐的作用? 为了访问安全

四、 init的作用:

+ (id)init {    return (id)self;}

init是构造方法,工厂设计。在对象实例化的时候被调用。我们看源码发现它返回的是自身,这主要是为了开放自定义接口,方便开发人员自定义自己需要的方法。

五、 new的作用:

+ (id)new {    return [callAlloc(self, false/*checkNil*/) init];}

经过源码的查看,发现new 相当于 alloc和init的组合。

缺点是new出来的对象,不会走自定义的init方法。直接走的是NSObject 的init。所以不建议开发时候使用。

上一篇 下一篇

猜你喜欢

热点阅读