oc的alloc 与init / new了解

前言:

我们声明时常常两步创建, 从字面意思可以理解为: 分配内存 和 初始化
那么这个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查看。

谢谢观看。

猜你喜欢

转载自blog.csdn.net/miaoleigemi/article/details/81100650