调用alloc或allocWithZone时会发生什么?

时间:2012-01-13 06:11:30

标签: objective-c

我想知道,Objective C对象究竟是如何创建的。我一直在阅读不同的博客文章和苹果文档,但我只能在这里找到关于ivar和objc_class结构以及各种其他运行时方法和结构的不完整信息。

但是我仍然没有得到,当我们在一个类上调用alloc时会发生什么?超类数据成员是如何添加到结构中的呢?

如果可能,任何人都可以向我解释这个或者指出这些实际分配内存的方法的源代码吗?

2 个答案:

答案 0 :(得分:4)

当调用alloc时,它(与任何其他消息发送一样)首先被(由编译器)转换为objc_msgSend *函数之一。此函数将类结构指针作为其第一个参数,并将@selector(alloc)作为其第二个参数。

然后,objc_msgSend查找+[class alloc]的相应方法实现,通常不会被覆盖(自定义初始化在概念上是在-initWith中完成的......),所以它通常是+ [NSObject alloc ]。 alloc很可能只是调用+ [NSObject allocWithZone:];该函数的实现可能会执行以下步骤:

1)它找到了类的大小(可能是通过class_getInstanceSize()) 2)它分配内存,最有可能使用class_createInstance()函数。此函数将分配的内存清除为零(这就是为什么,如规范所说,所有ivars在启动时显式初始化为0),然后将newliy创建的对象的isa指针设置为类结构本身。 3)allocWithZone:方法将新对象指针返回给alloc 4)alloc将对象指针返回给发送者,很可能它会遇到[Class initWith...:]

希望这会有所帮助。此外,除了Obj-C运行时文档之外,不要忘记检查GNUstep NSObject实现。这是GNU人员如何实现它以及Apple如何实现它的逻辑和可能方式。

答案 1 :(得分:1)