2012-01-13 82 views
3

我想知道,Objective C對象究竟是如何創建的。我一直在閱讀不同的博客文章和蘋果文檔,但我只能在這裏和那裏找到有關ivar和objc_class結構以及各種其他運行時方法和結構的不完整信息。當alloc或allocWithZone被調用時會發生什麼?

但我仍然沒有得到,當我們調用一個類alloc和如何超類的數據成員添加到結構會發生什麼?

如果可能的話,任何一個可以解釋這樣對我或點我的這些方法的實際分配內存的源代碼?

回答

4

alloc被調用時,它(如任何其他消息發送)第一被轉化(由編譯器)插入的objc_msgSend *功能之一。這個函數將獲得類結構指針作爲它的第一個參數,而第二個參數是@selector(alloc)

然後,objc_msgSend查找+[class alloc]的相應的方法實現,一般而言,它不會被重寫(自定義初始化在概念上是在-initWith中完成的),所以它通常是+ [NSObject alloc]。有可能alloc只是調用+ [NSObject allocWithZone:];該功能的實現可能執行以下步驟:

1)它找到類的尺寸(可能通過class_getInstanceSize()) 2)它分配內存,很可能使用class_createInstance()函數。此功能清除分配的內存零(這就是爲什麼,作爲規範說,所有高德被明確初始化爲0,在啓動時),然後設置newliy創建的對象的isa指針類結構本身。 3)allocWithZone:方法返回新鮮對象指針ALLOC 4)的alloc返回對象指針給發件人,最有可能將碰上[Class initWith...:]

希望這會有所幫助。另外,除了Obj-C運行時文檔外,別忘了檢查GNUstep NSObject實現。這是GNU人員如何實施它以及Apple如何實施它的邏輯和可行方式。

相關問題