2009-05-01 75 views
3

我有一個手動創建UIViewController(不是UINavigationController)並將該控制器的視圖添加爲子視圖的主視圖。當通過removeFromSuperview刪除其視圖時釋放UIViewController

subview然後通過[self removeFromSuperview]自行解散。我明白這會釋放視圖,所以這很好,但是現在我想要在視圖被移除時立即分配UIViewController以釋放內存並且不等到主視圖控制器被釋放。

我可以避免使用removeFromSuperview並反向引用主視圖控制器,並讓它關閉子視圖並釋放控制器,但感覺應該有更清晰的方式。

是否有一個完善的最佳實踐?

回答

5

正確的方法是您的子控制器要求主控制器將其刪除。如果你想減少這兩個控制器之間的耦合,創建一個委託協議,爲您的子控制器:

// This forward declaration avoids having a circular dependency 
// between MySubcontroller and MySubcontrollerDelegate 
@class MySubcontroller; 

@protocol MySubcontrollerDelegate 

- (void)hideMySubcontroller:(MySubcontroller*)subcontroller; 

@end 

如果有子控制器需要傳達給supercontroller等信息,這是一個偉大的地方加入有關調用。您可能不需要立即這樣做,但請記住將來版本的應用程序。

然後,delegate屬性添加到子控制器:

@interface MySubcontroller : UIViewController { 
    id <MySubcontrollerDelegate> delegate; 
    ... 
} 
@property (assign) id <MySubcontrollerDelegate> delegate; 
... 
@end 

其觀點呼籲removeFromSuperview相反的,子控制器應呼籲其委託hideMySubcontroller:,通過self作爲參數。然後

你的主控制器應聲明它實現委託協議:

@interface MyMainController : UIViewController <MySubcontrollerDelegate> 
... 
@end 

當主控制器創建一個子控制器,它應子控制器的delegate屬性設置爲self。它應該實現一個hideMySubcontroller:方法,它刪除子控制器的視圖,取消分配子控制器,並執行其他任何需要的操作。

使用委託協議意味着子控制器不必知道使用哪種對象;它只是知道在某個地方存在這樣的對象,並且它將符合委託協議。因此,兩個控制器之間的耦合儘可能小。順便說一下,如果你可以管理它,實際上最好保留子控制器以防需要再次使用它;這將節省重新創建它所需的處理時間。 (但是,如果收到內存警告,則應釋放它。)

相關問題