2009-05-01 76 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:方法,它删除子控制器的视图,取消分配子控制器,并执行其他任何需要的操作。

使用委托协议意味着子控制器不必知道使用哪种对象;它只是知道在某个地方存在这样的对象,并且它将符合委托协议。因此,两个控制器之间的耦合尽可能小。顺便说一下,如果你可以管理它,实际上最好保留子控制器以防需要再次使用它;这将节省重新创建它所需的处理时间。 (但是,如果收到内存警告,则应释放它。)

相关问题