通过removeFromSuperview删除其视图时释放UIViewController

Ste*_*lat 3 iphone cocoa-touch objective-c

我有一个主视图,手动创建一个UIViewController(不是UINavigationController)并将该控制器的视图添加为子视图.

子视图然后通过[self removeFromSuperview]解散自己.我理解这会释放视图,所以这很好,但是我现在想要除去视图被移除以释放内存并且不等到主视图控制器被解除分配时我立即分配的UIViewController .

我可以避免使用removeFromSuperview并对主视图控制器进行反向引用并让它解除子视图并释放控制器,但感觉应该有一个更清洁的方式.

有没有成熟的最佳实践?

Bre*_*don 5

正确的方法是让您的子控制器要求主控制器将其删除.如果要减少两个控制器之间的耦合,请为子控制器创建委托协议:

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

@protocol MySubcontrollerDelegate

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

@end
Run Code Online (Sandbox Code Playgroud)

如果存在子控制器需要与超级控制器通信的其他信息,这是添加相关调用的好地方.您可能不需要立即这样做,但请记住您应用的未来版本.

然后将delegate属性添加到子控制器:

@interface MySubcontroller : UIViewController {
    id <MySubcontrollerDelegate> delegate;
    ...
}
@property (assign) id <MySubcontrollerDelegate> delegate;
...
@end
Run Code Online (Sandbox Code Playgroud)

removeFromSuperview控制器不应调用其视图,而应调用hideMySubcontroller:其委托,self作为参数传递.

然后,您的主控制器应声明它实现了委托协议:

@interface MyMainController : UIViewController <MySubcontrollerDelegate>
...
@end
Run Code Online (Sandbox Code Playgroud)

当主控制器创建子控制器时,它应该将子控制器的delegate属性设置为self.它应该实现一个hideMySubcontroller:方法,它删除子控制器的视图,解除分配子控制器,并做任何其他需要的事情.

使用委托协议意味着子控制器不必知道将使用哪种对象; 它只是知道在某个地方有这样一个对象,并且它将符合委托协议.因此,两个控制器之间的耦合保持尽可能小.

顺便说一句,如果你可以管理它,实际上最好保持子控制器,以防你需要再次使用它; 这将节省重建它所需的处理时间.(但是,如果收到内存警告,则应释放它.)