返回
NSObject的alloc源码流程区别
IOS
2023-10-04 02:30:11
在Objective-C中,对象创建的底层原理是依赖于NSObject的alloc方法来实现的。当我们使用alloc方法创建一个对象时,系统会先调用NSObject的alloc方法来分配内存空间,然后将这个内存空间的地址返回给调用者。调用者再使用这个地址来初始化对象。
在上一篇文章中,我们已经分析了NSObject的alloc方法的源码。这篇文章,我们将重点分析NSObject中的alloc方法与自定义类的alloc方法的源码流程的区别,以及为什么NSObject中的alloc不走源码工程。
自定义类的alloc方法的源码流程如下:
- (instancetype)alloc {
Class isa = object_getClass(self);
return objc_alloc(isa);
}
而NSObject中的alloc方法的源码流程如下:
+ (instancetype)alloc {
return objc_msgSend(self, @selector(allocWithZone:));
}
- (instancetype)allocWithZone:(struct _NSZone *)zone {
[self doesNotRecognizeSelector:_cmd];
return nil;
}
从以上代码可以看出,自定义类的alloc方法直接调用了objc_alloc函数来分配内存空间,而NSObject中的alloc方法则是调用了objc_msgSend函数来发送allocWithZone:消息给自身。
NSObject中的alloc方法之所以不走源码工程,是因为它是一个私有方法。私有方法的意思是,它只能在该类内部被调用,不能被其他类调用。因此,当我们调用NSObject的alloc方法时,系统会先检查该方法是否为私有方法。如果它是私有方法,则系统会抛出异常。
为了解决这个问题,苹果公司在NSObject中提供了一个公开的方法allocWithZone:。allocWithZone:方法与alloc方法的功能相同,但它不是私有方法。因此,当我们调用NSObject的allocWithZone:方法时,系统不会抛出异常。