請考慮以下2碼聲明:混亂有關聲明指針ID
id class1 = [[MyClass alloc]init]; //First
MyClass * class2 = [[MyClass alloc]init]; //Second
class1
和class2
是指向型id
吧?在objc
的頭文件中,我看到Class
只是一個結構指針的typedef,而id
也是一個結構指針的typedef。將這些類型聲明爲struct指針,爲什麼我需要在代碼的第二個語句中包含*
?
請考慮以下2碼聲明:混亂有關聲明指針ID
id class1 = [[MyClass alloc]init]; //First
MyClass * class2 = [[MyClass alloc]init]; //Second
class1
和class2
是指向型id
吧?在objc
的頭文件中,我看到Class
只是一個結構指針的typedef,而id
也是一個結構指針的typedef。將這些類型聲明爲struct指針,爲什麼我需要在代碼的第二個語句中包含*
?
id
是一種類型。它可以容納一個指向任何對象的指針。Class
是一種類型。它可以容納一個指向任何類對象的指針。 (類對象是表示類的對象,即在調用類(+
)方法時獲取消息的對象。)MyClass *
是一種類型。它可以容納一個指針是MyClass
class1
和class2
是指向對象的實例的任何對象。
您似乎在類對象和類的實例之間有一些很大的混淆。 A MyClass *
是指向MyClass
實例的指針,即其類別爲MyClass
的對象。這與代表MyClass
類本身的類對象完全不同。 MyClass
類對象不是MyClass
的實例。類對象是一個更高級的話題,你現在可能應該不會考慮。
我認爲這是一個令人困惑的話題。關於知道什麼是運行時和編譯時,也有一點關係。 – nielsbot
@newact:如果你說'MyClass *'是一個類型,那麼它就像'aStruct * *'對嗎?如果我是對的,你能否解釋一下它的含義,因爲我認爲這是讓我困惑的最後一件事。謝謝。 – user007
@ user007:'MyClass'在Objective-C中不是合法類型,但如果它是合法的,它將是一個結構類型,就像C++中的類類型一樣。所以'MyClass *'是指向某個結構體的指針的類型。我認爲你的困惑來自這樣一個事實,即有一個名爲'Class'的類型是一個對象指針類型,你不知何故認爲你在任何地方看到了一個類的名字(例如,'MyClass'),你可以用'Class'來替換它。但它不是那樣的。 「'Class'」只是Objective-C中特殊類型的名稱。它與某些類的實例類型無關(例如'MyClass')。 – newacct