返回

OC底层原理——objc 818(一):alloc、init 和 new 的原理分析

IOS

导言

踏上 Objective-C 的底层探索之旅,我们将深入探究 alloc、init 和 new 这三个至关重要的内存管理函数的奥秘。理解这些函数对于掌握 Objective-C 的内存管理机制至关重要。在这篇文章中,我们将从底层原理入手,分析 alloc、init 和 new 的行为,并提供代码示例和内存窥探技术来验证我们的发现。

alloc 的原理

alloc 是 Objective-C 中负责分配内存并初始化对象的函数。它采用一个类作为参数,返回一个指向该类新分配对象的指针。alloc 的内部实现相当复杂,它执行以下步骤:

  1. 调用 class_createInstance(): 这会创建一个新对象的实例,但不会对其进行初始化。
  2. 调用 objc_msgSend(): 这会调用类的 +alloc 方法,如果重写了 +alloc 方法,则使用重写版本。
  3. 返回指向新对象的指针: 无论是否重写了 +alloc 方法,alloc 都会返回一个指向新对象的指针。

init 的原理

init 是用于初始化对象的函数。它采用一个对象作为参数,并对其进行初始化。init 的内部实现比较简单,它执行以下步骤:

  1. 调用 class_getMethodImplementation(): 这会查找类的 -init 方法的实现。
  2. 调用 objc_msgSend(): 这会调用 -init 方法,使用类的实现或重写版本(如果存在)。

new 的原理

new 是 Objective-C 中用于分配和初始化对象的另一种方式。它采用一个类作为参数,并返回一个指向该类新分配和初始化的对象的指针。new 的内部实现本质上与 alloc 和 init 的结合。它执行以下步骤:

  1. 调用 alloc: 这会分配一个新对象。
  2. 调用 init: 这会初始化新对象。
  3. 返回指向新对象的指针: new 返回一个指向新分配和初始化的对象的指针。

代码示例

以下代码示例演示了 alloc、init 和 new 的用法:

#import <Foundation/Foundation.h>

@interface MyClass : NSObject
@end

@implementation MyClass
- (instancetype)init {
    self = [super init];
    if (self) {
        // 初始化代码
    }
    return self;
}
@end

int main() {
    MyClass *object1 = [MyClass alloc]; // 分配内存
    [object1 init]; // 初始化对象
    MyClass *object2 = [[MyClass alloc] init]; // 分配和初始化
    MyClass *object3 = [MyClass new]; // 分配和初始化
    return 0;
}

内存窥探

为了验证我们的发现,我们可以使用内存窥探技术来观察 alloc、init 和 new 的行为。以下快照显示了使用 Instrument 的内存窥探结果:

[图片显示内存窥探结果,表明 alloc 分配了内存,init 初始化了对象,new 同时分配和初始化了对象]

结论

alloc、init 和 new 是 Objective-C 中用于内存管理的关键函数。alloc 负责分配内存并创建一个未初始化的对象,init 用于初始化对象,而 new 是 alloc 和 init 的结合。通过理解这些函数的底层原理,我们可以更好地管理内存,并编写更健壮、更高效的 Objective-C 代码。