[英]basic question about structure
struct
{
int integer;
float real;
}
first_structure;
因此我們可以通過編寫引用first_structure的成員
first_structure.integer = 7
如果我寫:
struct two_numbers
{
int integer;
float real;
}
first_structure;
然后我可以使用標簽* two_numbers *創建第二個結構,如下所示:
struct two_numbers second_structure;
我也知道typedef可用於創建同義詞。
但是我無法理解下面的代碼(從頁面http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocObjectsClasses.html ):
typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
因此,每個對象都有一個isa變量,該變量告訴它它是實例的什么類。
怎么知道???? 請引導我了解這段代碼的含義。
謝謝。
這是達到以下目的的捷徑:
struct objc_object
{
Class isa;
};
typedef struct objc_object * id
id
類型是指向objc_object
結構的指針。 因此,在使用id
類型時,您將使用->
運算符而不是.
,因為它是一個指針。
請注意, Class
類型也是結構的指針。 這稱為不透明類型。
基本上,這意味着編譯器將能夠計算大小,因為我們只有一個指針,但是它不知道實現細節。
這種模式用於隱藏結構的實際實現。 該類型在頭文件中定義,但是實現僅在源文件中定義。
例如,在頭文件中:
typedef struct A_Struct * A;
這是有效的,並且它定義了結構指針的類型,即使該結構實際上未知。
然后在源文件中:
struct A
{
int x;
int y;
};
這是真正的實現。 用戶將能夠創建A
類型的對象,但是將無法訪問成員,因為它們僅在您的源文件中是已知的。 用戶將為您傳遞A
類型的對象,但是您會將它們struct A
轉換為struct A
,因此您可以訪問它的成員。
IE瀏覽器:
void foo( A someObject )
{
struct A * a;
a = ( struct A * )someObject;
a->x = 42;
}
您可以知道,因為在實例化對象時, 運行時會設置isa指針以反映類的名稱。 類似於在Objective-C中使用“選擇器”的方式-如果您不熟悉,選擇器基本上就是方法的名稱。 在幕后,它只是一個NSString,但不一定非要(替代實現Cocotron使用我相信的整數類型的枚舉)。
基本上,運行時能夠知道正在創建哪個對象,因此可以設置isa指針。 內省是可行的,因為如果您將對象與“類”進行比較,則可能只是在比較幕后的NSString。
希望這能解決您的問題,如果沒有,我可以幫助您澄清
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.