2013-10-26 101 views
1

請考慮以下2碼聲明:混亂有關聲明指針ID

id class1 = [[MyClass alloc]init]; //First 
MyClass * class2 = [[MyClass alloc]init]; //Second 

class1class2是指向型id吧?在objc的頭文件中,我看到Class只是一個結構指針的typedef,而id也是一個結構指針的typedef。將這些類型聲明爲struct指針,爲什麼我需要在代碼的第二個語句中包含*

回答

0
  • id是一種類型。它可以容納一個指向任何對象的指針。
  • Class是一種類型。它可以容納一個指向任何類對象的指針。 (類對象是表示類的對象,即在調用類(+)方法時獲取消息的對象。)
  • MyClass *是一種類型。它可以容納一個指針是MyClass

class1class2是指向對象的實例的任何對象。

您似乎在類對象和類的實例之間有一些很大的混淆。 A MyClass *是指向MyClass實例的指針,即其類別爲MyClass的對象。這與代表MyClass類本身的類對象完全不同。 MyClass類對象不是MyClass的實例。類對象是一個更高級的話題,你現在可能應該不會考慮。

+0

我認爲這是一個令人困惑的話題。關於知道什麼是運行時和編譯時,也有一點關係。 – nielsbot

+0

@newact:如果你說'MyClass *'是一個類型,那麼它就像'aStruct * *'對嗎?如果我是對的,你能否解釋一下它的含義,因爲我認爲這是讓我困惑的最後一件事。謝謝。 – user007

+0

@ user007:'MyClass'在Objective-C中不是合法類型,但如果它是合法的,它將是一個結構類型,就像C++中的類類型一樣。所以'MyClass *'是指向某個結構體的指針的類型。我認爲你的困惑來自這樣一個事實,即有一個名爲'Class'的類型是一個對象指針類型,你不知何故認爲你在任何地方看到了一個類的名字(例如,'MyClass'),你可以用'Class'來替換它。但它不是那樣的。 「'Class'」只是Objective-C中特殊類型的名稱。它與某些類的實例類型無關(例如'MyClass')。 – newacct

1

因爲id指針struct已經:

typedef struct objc_object { 
    Class isa; 
} *id; 

凡爲MyClass不是指針。

+0

但是類的類型是Class,Class是指向struct的指針。 – user007

+1

@ user007不,他們不是; 'Class'描述了創建實例的類。 'MyClass *'指向一個類的實例。 – trojanfoe

+0

所以你的意思是這些類是'struct'類型的?那麼類怎麼符合'objc_msgSend'的參數,它需要一個'id'類型? – user007