欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OC -- alloc流程的探索

程序员文章站 2022-07-06 18:02:30
...

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

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

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

OC -- alloc流程的探索
OC -- alloc流程的探索

![在这里插入图片描述](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)
第二种方法: 符号断点查看源码出处

OC -- alloc流程的探索

OC -- alloc流程的探索

OC -- alloc流程的探索

OC -- alloc流程的探索

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

OC -- alloc流程的探索

OC -- alloc流程的探索

OC -- alloc流程的探索

OC -- alloc流程的探索

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

源码库下载
在源码库中找到objc4-781这个库,这个事现在最新的库:
OC -- alloc流程的探索
然后在这个库中去查看alloc是如何起作用的。

三、alloc 流程图:

OC -- alloc流程的探索

alloc 的核心方法:
  1. cls->instanceSize : 先计算出所需要的内存空间的大小
  2. calloc : 向系统申请开辟内存,返回地址指针
  3. 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。所以不建议开发时候使用。

相关标签: iOS objective-c