返回
iOS 底层原理 01: 深入剖析 NSObject、alloc、init 和 new 的源码
IOS
2024-01-24 12:38:11
在 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 中的作用。