簡體   English   中英

Objective-C 2.0中的類對象是什么?

[英]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 由此我推斷:

  • Obj-C 2.0中的繼承主要包括通過idisa字段鏈接這些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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM