返回

iOS 底层原理 01: 深入剖析 NSObject、alloc、init 和 new 的源码

IOS

在 Objective-C 中,对象是程序的基本单元。每个对象都属于一个类,并且可以发送消息给其他对象。对象通过 alloc 和 init 方法创建,并且可以使用 new 方法来创建一个对象。

alloc

alloc 方法用于分配内存空间并创建一个新的对象。它返回一个指向新对象的指针。对象的大小由其类的实例变量决定。alloc 方法的语法如下:

id alloc(void);

init

init 方法用于初始化新创建的对象。它对对象的实例变量进行赋值,使其处于一个有效的状态。init 方法的语法如下:

id init(void);

new

new 方法用于创建一个对象并返回一个指向该对象的指针。它与 alloc 和 init 方法的不同之处在于,new 方法会在创建对象后自动调用 init 方法。new 方法的语法如下:

id new(void);

源码分析

为了深入理解这些方法的实现,我们可以通过 clang -rewrite-objc main.c -o main.cpp 将 OC 代码编译成 C\C++ 代码来查看:

// NSObject.h
@interface NSObject {
    Class isa;
}
@end

// NSObject.m
@implementation NSObject
+ (id)alloc {
    return [[self class] allocFromZone:NULL];
}

- (id)init {
    return [self initWithZone:NULL];
}

+ (id)allocWithZone:(NSZone *)zone {
    return NSAllocateObject(self, 0, zone);
}

- (id)initWithZone:(NSZone *)zone {
    return self;
}
@end

从上面的代码中,我们可以看到 alloc 方法会调用 allocWithZone 方法,而 init 方法会调用 initWithZone 方法。allocWithZone 方法用于分配内存空间并创建一个新的对象,而 initWithZone 方法用于初始化新创建的对象。

总结

alloc、init 和 new 是 Objective-C 中创建对象的三种方法。alloc 方法用于分配内存空间并创建一个新的对象,init 方法用于初始化新创建的对象,而 new 方法会在创建对象后自动调用 init 方法。通过分析这些方法的源码,我们可以更好地理解它们是如何工作的,以及它们在 Objective-C 中的作用。