2009-09-24 26 views
1

這些都是相當簡單的問題,但有些事,我想在繼續之前,我的頭得到的權利...對象化妝,它的構造如何?

@interface BasicTire : NSObject { 
} 
@end 

@interface SnowTire : BasicTire { 
} 
@end 
  1. 當你調用[SnowTire的init]附帶的[超級初始化]調用[BasicTire init],然後調用[NSObject init]? (即級聯運行到父級/超級類別

  2. 當您[SnowTire alloc]創建單個新對象時,包括其superClass的功能。我是否認爲不創建多個對象以某種方式鏈接(即SnowTire> BasicTire> NSObject的)。

只是想檢查...

加里

回答

3
  1. 是的,通常初始化器調用超類初始化器。這是在執行init方法時明確完成的。雖然可以調用同一個類或其超類的其他初始化方法,但有必要確保總是調用"designated initializer"
    如果一個對象沒有實現init(或者初始值設定器),則調用超類中的對象(就像使用其他方法一樣)。這並不少見,因爲Objectve-C中的變量總是初始化爲0(在alloc中),所以通常不需要實現專門的init

  2. alloc只是分配內存並設置確定對象類的對象的「isa指針」。你從它得到的是一個未初始化的對象(不是鏈表),它的所有實例變量(包括超類)都有空間。

+0

完美,謝謝尼古拉 – fuzzygoat 2009-09-24 14:01:52

2
  1. 是。每個初始化器都必須調用超類的指定初始化器,一直到NSObject。每個初始化程序將來自超級初始化程序的結果分配給自己也很重要。由於初始化器不需要返回發送初始化消息的同一個實例。

  2. 是的。 alloc爲堆對象實例變量初始化足夠的內存,並用零清零此內存。這樣所有的指針將會是nil,布爾值false等。然後它將isa指針設置爲新對象的類。

1

當你調用[SnowTire的init]附帶的[超級初始化]調用[BasicTire的init]這反過來又調用[NSObject的初始化] (即運行到父/超級聯

你同時實現-[SnowTire init]-[BasicTire init],所以你可以看看你實現看出:

  1. -[SnowTire init]使用[super init]調用-[BasicTire init]
  2. 您的-[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的根類。