2011-05-18 57 views
1
struct 
{ 
int integer; 
float real; 
} 
first_structure; 

因此,我們可以通過編寫約結構基本問題

first_structure.integer = 7 

指first_structure的成員,如果我寫:

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變量,告訴它的是什麼類的一個實例。

怎樣才能告訴????請指導我瞭解此代碼的含義。

謝謝。

回答

1

這是一個快捷方式:

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,以便您可以訪問它的成員。

IE:

void foo(A someObject) 
{ 
    struct A * a; 

    a = (struct A *)someObject; 
    a->x = 42; 
} 
0

你可以說,因爲當一個對象被實例化時,運行時間設置isa指針來反映類的名字。與如何使用objective-c中的「選擇器」類似 - 如果您不熟悉,基本上選擇器就是方法的名稱。在幕後它只是一個NSString,但它不一定是(替代實現Cocotron使用整數類型的枚舉我相信)。

基本上,運行時能夠知道正在創建什麼對象,因此可以設置isa指針。內省可以起作用,因爲如果你比較對象與'類'的對比,你可能只是在比較幕後的NSString。

我希望這個解決您的問題,如果不是我能幫助澄清