创建对象时 alloc 和 init 的作用

前言:

关于这方面的问题,有些工作了多年的小伙伴对这些知识点的概念还是比较模糊,想着创建对象,无非就是[[Myclass alloc]init] 就直接创建好了对象,下面就开始做别的事情了,往往忽略了他们的本质区别。


# 一. 对象为什么要alloc,init又是干嘛的?

很多人都知道,初始化一个对象应该这么写:

MyClass* myObj = [[MyClass alloc] init];

那么有没有思考过为什么呢?其实我这么写也是完全可以的:

MyClass *myObj = [MyClass alloc];
myObj = [myObj init];

# 1. 解释:

alloc了一坨内存给myObj对象, 让它不释放, 并且把地址返回给指针; 但是这样过后, myObj是不能使用的。 为什么呢? 因为这段代码还没有被正确的初始化;

# 2. 举个例子:

比如公司要盖一个基地, 那第一步就是先要向政府申请一块地皮, 第二步才能在这块地皮上进行动工盖楼; 这里操作系统就是政府, alloc就是去申请地皮, init就是在盖房子; 如果没有调用init, 房子都没有修好, 别人怎么去住?


# 二. 关于alloc

alloc的主要功能就是:分配了一坨内存 给myObj对象, 让它不释放, 并且把地址返回给指针

# 1. 调用alloc后内存是直接映射到堆还是只分配给了虚拟内存?

先了解一下内存:

  • Clean Memory: 可以被操作系统回收的,在闪存中有备份, 能够再次读取重建。(包括: 代码段, framework等等)
  • Dirty Memory: 不可被操作系统回收的, 所有非Clean Memory。(包括:被分配了的堆控件, image cache等等)

结论: alloc不只分配在虚拟内存,同时会在物理内存建立映射。

# 2. 这一坨内存到底是多大?

内存分配采用的是: 字节对齐的方式.

字节对齐:

当我们分配一块内存的时候,假设需要的内存小于16个字节,操作系统会直接分配16个字节;加入需要的内存大于16个字节,操作系统会分配a*16个字节。举个栗子,如果你调用malloc并且需要4个字节,系统会给你一块16个字节的内存块;如果你调用malloc并且需要24个字节,系统会给你一块32个字节的内存块。


# 三. 关于init

init 的主要功能是: 来初始化这块内存, 只有初始化之后,这个对象才可以使用

需要调用init来初始化这块内存:

-init{
self=[super init]; // 1.
if(self){ // 2.
....
}
return self; // 3.
}
  1. 需要初始化父类的信息, 比如实例变量等等.(可以理解为: 王思聪在修房子前要询问他老爸的意见,他老爸说想娱乐会所, 他没有意见的话就会修成娱乐会所) ;
  2. 自定义一些初始化(可以理解为: 如果王思聪有意见, 那么他会在第二步时, 悄悄改为修成LOL俱乐部) ;
  3. 返回初始化好的对象 (可以理解为: 房子修改好了).