簡體   English   中英

有關結構的基本問題

[英]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.

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