OC -- alloc流程的探索
程序员文章站
2022-07-06 18:02:30
...
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)
第二种方法: 符号断点查看源码出处
第三种方法: 汇编查看跟流程
二、 在源码库中去找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。所以不建议开发时候使用。
上一篇: 诸葛亮弹琴