2012-01-06 69 views
9

我知道alloc是一個類方法,它創建類的對象並將它的「isa」指針指向類,並指出消息在運行時的映射方式。alloc在Objective C中如何工作?

我對allocWithZone和區域有一些想法。

誰能告訴我,或指向我一個很好的鏈接,解釋說: -

了ISA指針指向正確的類?

分配了多少內存?

從父類繼承的成員的內存是如何創建的?

如果id是objc_object *的typedef,它的isa指針指向什麼,那麼它如何保存anyobject,因爲isa指針會讓我們到調度表,它有方法的選擇器,但它們是否有任何東西可以告訴我們數據成員應該在那裏?

回答

8

編譯器在後臺爲您插入通過objc運行時的調用。您可以在包含路徑objc/中找到該庫。 objc/runtime.h可能是最感興趣的。作爲獎勵,一些選擇的常見信息繞過objc_msgSend這些插入。

isa指針如何指向正確的類?

objc_constructInstance

多少內存分配?

class_createInstance 
class_getInstanceSize 

如何記憶成員父類繼承產生的?

將存儲器清零,並設置isa

如果id是objc_object *的類型定義,什麼是它的isa指針指向,那麼它是如何保持anyobject因爲isa指針將獲得我們擁有選擇的方法調度表,但他們有什麼,告訴我們有什麼數據成員應該在那裏?

無論在初始化時設置了什麼。 ObjC對象指針只是原始內存。與其它語言不同,鑄造和書面類型的轉換是直接設置變量的地址 - 沒有在下面的結構沒有明確的類型提升或轉換存儲:

MONDisplay * display = [NSString string]; 
NSLog(@"%@", display); 

指針只是返回的值相同[NSString string]

+1

'id'是代表一個指針,而不是對象的類型,所以它不具有ISA' '它自己的。當你聲明一個'id'類型的變量時,它意味着你可以爲任何類型的對象分配一個指針,編譯器不會抱怨它。當然,對象本身有一個「isa」成員,根據定義,它指向所討論對象所屬的類是一個實例。 – Caleb 2012-01-06 15:41:12

相關問題