當你調用[SnowTire的init]附帶的[超級初始化]調用[BasicTire的init]這反過來又調用[NSObject的初始化] (即運行到父/超級聯
你同時實現-[SnowTire init]
和-[BasicTire init]
,所以你可以看看你實現看出:
- 你
-[SnowTire init]
使用[super init]
調用-[BasicTire init]
。
- 您的
-[BasicTire init]
使用[super init]
致電-[NSObject init]
。
[super init]
總是調用下一個可用的實現,即使它不在您的直接超類中。如果您未執行-[BasicTire init]
,則-[SnowTire init]
中的[super init]
表達式將調用-[NSObject init]
。這很好,因爲你顯然決定一個BasicTire不需要任何初始化。 (如果是這樣,那麼你的-[BasicTire init]
遺漏是個錯誤。)
當你[SnowTire頁頭]你正在創建一個新的對象,包括其超類的功能。我認爲你不要創建以某種方式鏈接的多個對象(即SnowTire> BasicTire> NSObject)。
是的。每個對象都有一個類(在名爲isa
的變量中,如「此實例是 SnowTire」),每個類都有一個超類和一個元類。和所有的Objective-C方法和C函數一樣,每個函數都只返回一個東西,在這種情況下,只有一個實例帶有一個類。
因此,例如,當您向您的雪地輪胎髮送gripTheSnow
消息時,它會使用SnowTire對該方法的實施。如果您發送retain
消息,那麼您在SnowTire中沒有實現retain
,並且您沒有在BasicTire中實現它,因此它使用NSObject的實現。運行時搜索從對象的類(在此示例中爲SnowTire)開始,沿着直線沿着類層次結構向上搜索,結束於諸如NSObject的根類。
完美,謝謝尼古拉 – fuzzygoat 2009-09-24 14:01:52