返回
iOS 内存管理:alloc 源码解析(四)
IOS
2023-09-10 11:50:37
在上一篇中,我们对 alloc 的源码进行了详细的分析。本篇我们将继续探讨在上一篇文章的基础上,进一步深入研究 NSObject 类中的 alloc 与自定义类中的 alloc 之间的区别,以及为什么 NSObject 类中的 alloc 不走源码工程。
主要差异
主要差异在于 NSObject 类中的 alloc 实际是调用了 C 函数 objc_msgSend(),而自定义类中的 alloc 则会调用 Objective-C 的运行时函数 objc_allocateClassPair()。
- objc_msgSend(): 该函数是一个通用消息发送函数,可以向任何对象发送消息。在 NSObject 类中,alloc 消息实际上是发送给类对象的,并且被实现为一个 C 函数。
- objc_allocateClassPair(): 该函数是一个 Objective-C 的运行时函数,用于创建一个新的类。在自定义类中,alloc 消息实际是发送给元类对象的,并且被实现为一个 Objective-C 的运行时函数。
alloc 不走源码工程的原因
在自定义类的源码中,alloc 会调用 objc_allocateClassPair() 函数,而 objc_allocateClassPair() 函数会创建一个新的类,并返回该类的类对象。在 NSObject 类中,alloc 会调用 objc_msgSend() 函数,而 objc_msgSend() 函数会向类对象发送 alloc 消息,并且类对象会创建一个新的实例并返回该实例。
这也就是说,在自定义类中,alloc 会创建一个新的类,而在 NSObject 类中,alloc 会创建一个新的实例。这就是为什么 NSObject 类中的 alloc 不走源码工程的原因。
结论
通过对 NSObject 类和自定义类中 alloc 源码的分析,我们可以看到,两者的 alloc 源码是完全不同的。这导致了自定义类和 NSObject 类在创建新实例时行为不同。在自定义类中,alloc 会创建一个新的类,而在 NSObject 类中,alloc 会创建一个新的实例。这也是为什么 NSObject 类中的 alloc 不走源码工程的原因。