前言:
我们声明时常常两步创建, 从字面意思可以理解为: 分配内存 和 初始化
那么这个alloc
和 init
分别都做了什么事情呢?
alloc
负责创建对象, 这个过程包括了分配足够的内存来保存对象
, 写入isa指针
, 初始化引用计数
, 以及重置所有实例变量
这四个过程.
init
负责初始化对象, 这意味着此时此对象处于可用状态, 即对象的实例变量可以被赋予合理有效值.
一.先看看 alloc 的API描述解说
返回这个接受消息的类的一个实例.
这个实例初始化后可以用来表示这个类的数据相关的结构;
所有其他的实例变量的值都被设置成 0.
你必须使用 init... 方法来最终完成这个初始化的步骤,如下:不要重写 alloc 来包含初始化的代码.
你可以使用指定版本的 init... 方法来达到你的目的
由于历史原因,allc 方法调用了 allocWithZone: 方法.
结论:
1. alloc 后只是在系统中分配了内存,这段内存空间的大小与这个类本身结构所占字节的大小相等,并返回了这段内存的指针.
2. alloc 将申请内存空间中的值都设置为 0.
3. alloc 调用了方法 allocWithZone:.
4. alloc 就执行了一次,没有继承的关系.
二.init 的API描述解说
再看看 init 的API描述解说
子类实现初始化一个刚刚获取到内存空间的对象.
init 消息与 alloc (或者是 allocWithZone:) 消息在一行内执行:
对象只有执行了 init 方法后才能够被使用.
NSObject 类定义了这个初始化方法,但是 NSObject 并没有初始化什么,它直接将指针返回了 might return nil from
如果要自定义这个实现方法.
你必须调用 super 来先初始化父类的对象.
如果这个新对象不能被初始化,这个方法就应该返回 nil.
例如,假设有一个照相机相关的类,如果在一个没有照相机的设备上调用了这个类,那么,在父类的 init 方法中就会返回 nil.
- (id)init {
self = [super init];
if (self) {
// Initialize self.
}
return self;
}
结论:
1. 重写 init 方法时需要先初始化父类的 init 方法.
2. NSObject 中的 init 方法什么也没做,只是返回了自己而已.
3. 如果初始化失败,会返回 nil.
三.alloc init与alloc new区别
new和alloc/init在功能上几乎是一致的,分配内存并完成初始化。
差别在于,采用new的方式只能采用默认的init方法完成初始化,
采用alloc的方式可以用其他定制的初始化方法。
详细请点击https://www.jianshu.com/p/32429b53fe70查看。
谢谢观看。