随便说说 alloc 和 init

栏目: IOS · 发布时间: 5年前

内容简介:先抛出一个小问题,然后延伸引入接下来要说的zuyuClass *z = [zuyuClass alloc];zuyuClass *z1 = [z init];

先抛出一个小问题,然后延伸引入接下来要说的

zuyuClass *z = [zuyuClass alloc];

zuyuClass *z1 = [z init];

zuyuClass *z2 = [z init];

NSLog(@"%p - %p - %p",z,z1,z2);

思考一下是控制台的输出是怎么样的

思考过后代码试一下

z,z1,z2三个对象的地址是完全一样的

alloc 做了些什么?init 做了些什么?

OK我们现在正是开始今天的内容

想知道 alloc 都干了些什么.最简单的方式就是看源码对吧.来,咱们瞄一眼源码去

随便说说 alloc 和 init

1

继续往下

随便说说 alloc 和 init

2

继续

随便说说 alloc 和 init

3

好,到这里简单说一下,会走到红色选中的位置,为什么会走到这儿呢? 通过下符号断点,显示的汇编中看出来,这咱们就简单的一句带过,不详细说.

随便说说 alloc 和 init

简单说明

咱们继续往下

class_createInstance

随便说说 alloc 和 init

4

继续往下

随便说说 alloc 和 init

5

好了 划重点了开始

重点1.      size_t size = cls->instanceSize(extraBytes);     6518行

创建对象首先最重要的大家应该都知道啦  ,  内存 , 对吧. 这个 size 就是获取该对象需要多大的空间,从而进行字节对齐

(字节对齐简单来说就是 ,比如改对象需要12个字节, 那么就返回16字节 .如果该对象需要23个字节,那么就返回24字节 . 为什么要对齐?  玩过逆向,汇编或者研究过底层的朋友就比较理解这个,在这咱们就不多说了)

随便说说 alloc 和 init

5.1获取该对象所需要的空间

随便说说 alloc 和 init

5.2调用算法计算出所需要的内存空间

这是 alloc 做的第一件事 .计算并进行字节对齐.

咱们继续抛出一个问题,比如现在有个 zuyuClass 的类.  有NSString 类型的 name(8字节) 和 int 类型的 age(4字节) .根据字节对齐. 这个类的对象占用了多少字节的内存?

脑袋里边想着是16的,可以用代码输出一下 看一下 , 是24 .问题又来了 ,为什么是24个字节

重点2.        obj->initInstanceIsa(cls, hasCxxDtor)   6525行.

创建一个 isa.  isa 占用了8个字节 . 万物皆对象,对象皆有 isa

随便说说 alloc 和 init

对象皆有 isa

ok.这个时候大家是不是就以为zuyuClass在内存中就占用24个字节了?

NO,NONONO .重点3来了  ------> obj = (id)calloc(1, size);   6523行

这个 calloc 最终会走到这里(下图)

随便说说 alloc 和 init

calloc进行的内存对齐

随便说说 alloc 和 init

16倍数对齐

所以最终 zuyuClass 的这个对象内存中占用的空间是32字节而不是24字节

alloc我们就说到这里

接下来简单说说 init. 为什么要简单说说呢,因为没办法详细说啊

来,我们看一眼源码

随便说说 alloc 和 init

init源码

随便说说 alloc 和 init

rootinit

看到了吧 .init 干嘛了?init 啥都没干!只是返回了自己!

所以也就解释了一开始抛出的问题  .是不是看到这里已经颠覆了你的 alloc 是开辟空间,init 是初始化的理解?

可能有同学要问一下,init 既然啥都没干,为啥还要 init 这个方法,要它何用?

一句话回答, 自定义初始化. 也就是重写 init.

那么现在最后抛出一个问题

在创建某一个类的对象的时候,alloc 和 init 分别起到了什么作用. 是不是瞬间感觉脑海里的回答比之前高大上了许多

作者:_zuyu

链接:https://www.jianshu.com/p/daf668b76861


以上所述就是小编给大家介绍的《随便说说 alloc 和 init》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

React Native:用JavaScript开发移动应用

React Native:用JavaScript开发移动应用

【美】Truong Hoang Dung(张皇容) / 奇舞团 / 电子工业出版社 / 2015-9 / 65.00

React Native是当前移动端开发中的优秀解决方案。《React Native:用JavaScript开发移动应用》围绕着如何将一个完整App提交到App Store,讲解了使用React Native开发iOS应用所涉及的方方面面。首先介绍了Flexbox布局,教大家从零开始搭建一个初始应用,以此阐明React Native的基础运行机理;然后介绍了Flux的设计思想,怎么理解和使用Pro......一起来看看 《React Native:用JavaScript开发移动应用》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换