4

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

然后子视图通过 [self removeFromSuperview] 自行关闭。我知道这会释放视图,所以这很好,但是我现在想摆脱 UIViewController 我在视图被删除以释放内存时立即分配,而不是等到主视图控制器被释放.

我可以避免使用 removeFromSuperview 并反向引用主视图控制器并让它关闭子视图并释放控制器,但感觉应该有一种更清洁的方式。

是否有既定的最佳实践来实现这一目标?

4

1 回答 1

5

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

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

@protocol MySubcontrollerDelegate

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

@end

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

然后delegate给子控制器添加一个属性:

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

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

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

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

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

使用委托协议意味着子控制器不必知道什么样的对象会使用它;它只知道某处有这样一个对象,并且它将符合委托协议。因此,两个控制器之间的耦合保持尽可能小。

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

于 2009-05-01T04:53:10.767 回答