2012-02-13 22 views
0

通常,當我使用viewcontroller時,會將當前viewcontroller推開,我使用UINavigationController並push/pop新viewcontrollers並讓它們自己處理所有的dealloc。通過addSubiew添加的子視圖viewcontroller是否需要dealloc?

但是,例如,在這種情況下,我有一個MainViewController,它是應用程序啓動時的默認視圖。我有第二個視圖,稱爲SecondaryViewController,它是主屏幕上的彈出窗口(有點像lightbox)。

下面是代碼來說明:

//From within mainViewController: 
secondaryViewController = [SecondaryViewController alloc] initWithNibName:@"SecondaryViewController" bundle:nil]; 
[self.view addSubview:secondaryViewController.view]; 

的secondaryViewController界面看起來是這樣的:

//interface 
@interface SecondaryViewController : UIViewController 
{ 
    IBOutlet UILabel *httpLabel; 
    IBOutlet UIScrollView *scrollView; 
} 
@property(retain, nonatomic) IBOutlet UILabel *httpLabel; 
@property(retain, nonatomic) IBOutlet UIScrollView *scrollView; 

至於實施,我有@synthesize@property實例變量,但我不做任何手動分配。然而,我沒有把dealloc方法:

- (void)dealloc 
{ 
    [httpLabel release]; 
    [scrollView release]; 
    [super dealloc]; 
} 

但我不知道我需要上述。

所以我的問題是以下幾點:

1)我需要在這種情況下,上述dealloc方法?或者更一般地說,子視圖何時需要一個dealloc方法?

2)如果我做或不需要它,取決於我是否通過addSubview或pushViewController添加secondaryViewController?舉例來說,如果我想更換整個mainViewController,與此:

[self.navigationController pushViewController:secondaryViewController animated:NO] 

請問secondaryViewController需要一個dealloc方法?

謝謝!

回答

1

是的,在這種情況下,您確實需要dealloc方法,就像您擁有它一樣。你在正確的軌道上,因爲你認爲既然你沒有做任何手動分配,你不需要做任何dealloc /釋放......但是,通過指定屬性(保留,非原子),你是做隱性保留。

這意味着,如果你設置這些屬性,有什麼幕後實際發生的是這樣的:

-(void)setHttpLabel:(UILabel *)newlabel 
{ 
    if (newLabel != httpLabel) 
    { 
    [httpLabel release]; 
    httpLabel = [newLabel retain]; 
    } 
} 

正如你所看到的,你的合成是造成保留的對象上發生。如果你永遠無法平衡保留與釋放,它會泄漏。因此,唯一合乎邏輯的地方就是使用dealloc方法。這創造了生命的圈子。

如果你從來沒有設置這些屬性,並且沒有在dealloc中釋放,那麼它不會泄漏任何東西,但你顯然不想做出這些假設。

如果您沒有任何保留屬性或任何手動分配ivars,那麼只有這樣,纔可以使用dealloc方法。

希望有所幫助。

0

如果在將視圖添加到層​​次結構後需要從主視圖控制器訪問secondaryViewController,則不應在此時解除分配它。如果您在顯示後不需要訪問輔助控制器,則可以在此時解除分配。

實際上,如果secondaryViewController是ivar,那麼保留對​​它的引用可能是有意義的。如果它是一個局部變量,並且稍後您不訪問它,則應該釋放它。

+0

謝謝。然而,我的問題是,我是否需要在secondaryViewController中使用dealloc()方法。 – kurisukun 2012-02-13 01:15:11

1

我認爲這是允許在最新的iOS 5 +,但以前你不應該添加另一個viewcontrollers視圖到你的主視圖控制器。這是明顯的濫用,並可能導致問題。

viewcontroller的概念是控制所有視圖的人。視圖控制器不應該控制另一個視圖控制器,除非它是容器視圖控制器,例如UINavigationController/UITabBarController。

所以請重新考慮設計。爲什麼你需要SecondaryViewController。爲什麼mainviewcontroller不能管理輔助視圖?

最後,每個viewcontroller應該有dealloc在裏面。

+0

我認爲如果我把每個子視圖的邏輯放在他們自己的視圖控制器中,它會更乾淨和模塊化。我實際上有3個子視圖(和每個控制器),每個都有不同的邏輯,需要在其中進行處理。將所有邏輯放入一個mainviewcontroller是否更好?會出現什麼樣的問題? – kurisukun 2012-02-13 02:38:39

相關問題