2012-09-10 58 views
2

可能重複:
When should I call super?超類的方法放置

是有區別/首選方式撥打電話給超類方法,如[super viewDidLoad][super init][super viewDidUnload]什麼時候?我看過教程把它們放在第一行或作爲子類方法的最後一行。我只是想知道是否會有一樣,如果超類的方法會做一些設置所謂的前期,當孩子可以使用任何依賴性或者如果超可以做一些優化的東西孩子做當年底叫。

+1

的[我什麼時候應該叫超?(http://stackoverflow.com/questions/3906704/),[我應該叫\ [超級superMethod可能重複\]後我自己的代碼或之前呢?](http://stackoverflow.com/questions/7441519/),[頂部或底部超級調用重寫的方法](http:// stackoverflow。(http://stackoverflow.com/questions/3466889/),[調用ObjectiveC中的超類問題方法的時機?](http:/ /問題/ 12019031 /),[調用超級] /stackoverflow.com/questions/1005196/) –

回答

4

我的一般經驗法則是,施工/創建行爲首先通過super調用,而銷燬行爲或拆除行爲發生的順序相反 - super稱爲最後一次。很少有必要偏離這一點。

原因通常不是用於優化(正如您在文章中所述),而是用於可預測的語義

實施例A:

結構:

- (id)init 
{ 
    self = [super init]; // << set up super 
    if (0 != self) { 
    // set up self 
    ... 

破壞:

- (void)dealloc 
{ 
    [ivar release], ivar = 0; // << tear down self 
    [super dealloc]; // << tear down super 

實施例B:

結構:

- (void)viewWillAppear:(BOOL)pAnimated 
{ 
    [super viewWillAppear:pAnimated]; // << call through super first 
    // now set up self 
    ... 

破壞:

- (void)viewDidDisappear:(BOOL)pAnimated 
{ 
    // tear down self 
    [super viewDidDisappear:pAnimated]; // << now tear down super 
+1

我剛剛介紹過'init',但你完全正確。 –

0

您必須初始化超級第一個,因爲超級構造函數可以選擇返回除原始值self以外的值。

self = [super init]; 

如果初始化的self其他屬性調用[super init]之前,這些變化可能會被刪除。

這到底是幹嘛的?

@Justin指出類集羣(用於返回NSDictionary或NSString的實例時)使用此機制根據任務提供稍微不同的子類。單身也可以用這個和Objective-C的(廢棄)Pose功能,可以爲好。

+0

我不知道這是否真的發生在實踐中,但你必須遵守規則。 –

+0

它確實發生。類集羣和單例是顯着的例子。 – justin

+0

我想到了單身,然後一陣寒意流過了我。在接收單例之後初始化子類似乎不是一個好主意 - 原始的可能是不同的子類,或者有運行數據。 –