博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
笔记-从源码角度分析alloc与init的底层
阅读量:6366 次
发布时间:2019-06-23

本文共 708 字,大约阅读时间需要 2 分钟。

先抛出一个问题,看下面代码:

LGPerson *p = [LGPerson alloc];LGPerson *p1 = [p init];LGPerson *p2 = [p init];复制代码

上面三个对象的指针分布情况?

运行结果:

可以发现,这三个对象的地址是一样的,为什么呢?这里就引起思考,上面的allocinit到底做了什么?下面我们通过分析一下。

alloc源码分析

先看alloc,如下图

_objc_rootAlloc()里的
self在这里指的是
LGPerson,然后走到
_objc_rootAlloc()方法里
接着往下面走,进入
callAlloc()方法

通过断点的方式,可以看到该方法的走向,进入
class_createInstance方法,如下图

接着进入_class_createInstanceFromZone方法,可以称之为“干实事”的方法,如下图

通过
instanceSize()方法分配内存,
calloc()开辟空间,
initInstanceIsa()创建对象。
并且进入
initInstanceIsa()方法可以发现,创建对象的同时,伴随初始化了
isa

init源码分析

进入init方法

进入
_objc_rootInit方法
可以看到,其实
init方法什么事情都没有做。

思考:为什么init会什么都不做?

其实这是一种设计模式,自己思考一下,日常开发过程中,我们会在什么情况下,进行init方法的使用。—— 重写

在重写默认初始化的时候,我们可以根据自己的需求,进行各种个性化的设置。
工厂设计,父类没有执行,交给子类去实现。

alloc流程图

转载地址:http://anrma.baihongyu.com/

你可能感兴趣的文章
好程序员的查克拉---自信
查看>>
线程池的设计(二):领导者追随者线程池的设计
查看>>
获取设备列表
查看>>
Django使用网上模板做个能展示的博客
查看>>
基于同IP不同端口,同端口不同Ip的虚拟主机 基于FQDN的虚拟主机
查看>>
项目软件集成三方模块,编译中int32和uint32定义冲突解决方法
查看>>
StretchDIBits速度测试(HALFTONE)
查看>>
在.NET Workflo“.NET研究”w 3.5中使用多线程提高工作流性能
查看>>
验证Oracle处理速度
查看>>
自己写一个jquery
查看>>
艾伟:C#中抽象类和接口的区别
查看>>
Flink - NetworkEnvironment
查看>>
BZOJ4374 : Little Elephant and Boxes
查看>>
【.Net Framework 体积大?】不安装.net framework 也能运行!?开篇叙述-1
查看>>
LLDP协议、STP协议 笔记
查看>>
如何使用 GroupBy 计数-Count()
查看>>
jquery之clone()方法详解
查看>>
Delphi 用文件流读取文本文件字符串的方法
查看>>
php中怎么导入自己写的类
查看>>
C# 委托
查看>>