2010-10-11 89 views
22

什麼是[super ... any method name]的最佳使用方法。最近我發現,在dealloc中,[super dealloc]必須站在同一端。因爲任何以前沒有使用的變量,如果在[super dealloc]之後設置,可以由垃圾填充。這是一件很少見的事情,但它是可能的。在此之後,我們將在我們的應用程序崩潰。我應該什麼時候打電話給超級?

那麼什麼是最好的使用超級方法,例如什麼是最好的使用-(void)viewWillAppear:(BOOL)animated[super viewWillAppear:(BOOL)animated]在身體最開始或最後的最佳位置在哪裏?

回答

50

通常的經驗法則是,當你重寫一種做某種初始化的方法時,你先調用超級方法,然後做你的事情。而當你重寫某種拆卸方法,你叫超級最後:

- (void) setupSomething { 
    [super setupSomething]; 
    … 
} 

- (void) tearDownSomething { 
    … 
    [super tearDownSomething]; 
} 

第一種是像init…viewWillAppearviewDidLoadsetUp方法。第二種是像deallocviewDidUnloadviewWillDisappeartearDown。這不是硬性規則,它只是從方法所做的事情出發。

+1

謝謝,這是一個很好的實踐規則。 – 2010-10-12 16:19:58

+1

也值得注意的是,在** ARC **下,在'dealloc'實現中你根本不必調用'[super dealloc]' – 2013-01-03 16:28:47

+3

甚至不可能,如果你這樣做,編譯器會打你。 – zoul 2013-01-03 16:37:09

3

它主要取決於您的子類是否需要事件發生在超類方法之前或之後。或者兩者,視情況而定。

這就是爲什麼init方法首先調用super方法,而dealloc方法最後一件事。在你的例子中,當你被通知一個視圖會出現時,你可能想要讓超級用戶做它的事情,然後,在這之後,照顧你的子類視圖需要做的事情。但可以想象,也可以採用其他方式,或者可以在代碼之間調用超級方法。根據您的應用程序的需求,不同的規則將適用。

15

只需檢查相應的文件。例如,當調用超在UIViewController覆蓋的方法:

didReceiveMemoryWarning:您可以 重寫此方法(如需要),以 釋放由 您的視圖控制器使用的任何額外的內存。如果確實如此,請在 的某處確定撥打超級執行 以允許視圖 控制器釋放其視圖。 [指的順序並不重要。]

的loadView:此方法的你自定義實現 不應調用超級

setEditing:動畫:此方法 更新其觀點之前應該調用超級的實施 。 [意味着訂單是重要的。]

viewWillAppear中viewDidAppearviewWillDisappearviewDidDisappear: 如果重寫此方法,則必須調用 超級在 實現一些點。 [指的順序並不重要。]

的dealloc:如果實施此方法 但建立您的 的iOS 2.x的應用程序,你的dealloc方法應該 釋放每個對象還應該 請在致電super之前將該對象的引用設置爲 。 [指的順序是非常重要的。]

你實現viewDidLoad中和viewDidUnload方法超級類似的規則,都沒有提到?因爲你不需要在這些中調用超級。

+1

請注意:處理更深層次結構時必須小心。如果A從UIVIewController繼承並重寫viewDidLoad,並且B從A繼承並且也覆蓋了viewDidLoad,那麼在B的實現中發送[super viewDidLoad]是強制性的。正如Comptrol所說,A的文檔應該明確說明,而實現B的開發人員應該閱讀A的文檔。 – 2011-01-03 17:02:07

相關問題