[英]What is a class object in Objective-C 2.0?
在2009年發布的名為Apple 的Objective-C 2.0編程語言的 Objective C 2.0的官方文檔中,有一個關於類對象的段落在第28頁。
我不明白Class Objects是什么,以及如何定義它們除了語言的其余部分以及它們具有什么屬性。 在同一文檔中,它解釋了Objective-C 2.0中的所有內容都是一個對象,該對象基本上是一個指向包含isa
字段的struct
的指針,而指針本身的類型為id
。 由此我推斷:
id
和isa
字段鏈接這些struct
nil
對象的方式構造isa
字段。 id
是Objective C 2.0中幾乎所有內容的有效數據類型 isa
指針的下方/下方開始打包的 假設我得到了Objective C 2.0的工作原理,什么是類對象,它與實例的創建方式有何不同? 類對象提供的實例沒有什么類型的屬性? 你可以與C或C ++並行嗎?
好的,所以你定義一個類。 我們叫他查理:
@interface Charlie : NSObject
@end
這是我們的小課! 因為 - 就像Obective-C中的其他每個類一樣 - 查理是一個對象,你可以像[Charlie alloc]
查理分配[Charlie alloc]
那樣發送消息讓Charlie為你分配一個實例。 這就是我們對類對象的意思:它是表示您定義的類的對象。
Objective-C中的對象是什么? 類是基於這個結構定義的:
struct objc_object {
Class isa OBJC_ISA_AVAILABILITY;
};
並且類由以下結構表示:
struct objc_class {
struct objc_class *isa;
struct objc_class *super_class;
// A bunch of other members …
}
正如你所看到的,兩者都以isa
引用一個類開頭。 所以類只是普通對象的擴展。
當Charlie創建一個實例時,該實例的isa
將指向Charlie。 不過查理的什么呢isa
點? 嗯,它指向一個元類。 元類是一個奇怪的東西 - 它是一種特殊的類,只是作為一個類的類而存在。 你永遠不會直接與它互動; 當你與其唯一的實例Charlie進行互動時,它只是履行其合理的職責†。
這就是我們談論類對象時的意思 - 它只是表示您在代碼中定義的類的對象。
†你可能想知道班級的職責是什么。 嗯,顯而易見的是,這就是你創建對象的方式。 但除此之外,Objective-C中的實例並不擁有自己的方法。 相反,方法解析是基於對象的isa
,因此除了為您創建實例之外,類最重要的功能是確定對象具有哪些方法。
什么是類對象以及它與實例的創建方式有何不同? 類對象提供的實例沒有哪些屬性? 你可以與C或C ++並行嗎?
讓我們嘗試與C和C ++進行比較。 首先,沒有與C的比較,因為C不是面向對象的,因此對象或類的概念不存在。 在C ++中,您擁有在.h文件中聲明的類(或對象),在那里編寫類的定義(名稱,實例變量,方法或函數),然后在.cpp文件中實現定義中聲明的方法。
同樣在C ++中,您可以擁有靜態變量和方法,正如您可能知道的那樣,它們不屬於該類的特定實例,我們可以說它們會影響所有實例 。
在目標C中, 類屬性或類方法類似於C ++中的靜態變量和靜態函數 。
類對象是Objective C 封裝類定義並使其在運行時可用的方式。 您不一定明確地實例化類對象。
考慮這個課程
@interface MyObject : NSObject
{
int i;
}
- (void)myFunction;
+ (void)classFunction;
@end
您可以使用以下方法實例化此類對象:
MyObject *obj = [[MyObject alloc] init];
在這里,您將使用MyObject
類對象的alloc
方法。 要理解的重要一點是,您沒有實例化類對象,編譯器只創建一個對象,一個類對象,來表示類。
Object是一個結構,有isa
指向其Class的字段。 這isa
允許結構接收Objective-C消息,這使它成為一個Object。 isa
指向的類用於查找這些消息的實現。
(有趣的是,塊也是對象,GCD結構也是。它們都可以接收消息,例如-copy
用於塊或-description
用於dispatch_queue
。)
類是用於查找其實例的方法的結構。 它有一個實例的方法實現列表( -methods
)。 類具有isa
字段,因此它們可以作為對象限定,因此也可以接收消息。 類的isa
指向元類,因此類是元類的實例。 它的單個實例 - 單身。
Metaclass是我迷路的地方,但它肯定是一個對象,因為它有isa
。 Metaclass有一個單個實例的方法實現( +methods
)列表--Class。
當你編寫這段代碼時:
@interface MYObject : NSObject
+ (void)classMethod; // Stored in Metaclass
- (void)instanceMethod; // Stored in Class
@end
您正在創建一對:Class和Metaclass 。
哦,什么是元類? 根元類!
什么是根元類的一類? Root Metaclass本身!
但那么Metaclasses的isa
指向哪里? 給我們的老朋友NSObject
。 太元了 ,對吧?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.