正确分配/释放UINavigationControllerDelegate

4

我有一个 UIViewController 需要使用 UINavigationControllerDelegate,具体是使用willShowViewController方法。

我的实现中设置了<UINavigationControllerDelegate>,然后在viewDidLoad中将代理设置为self(self.navigationController.delegate = self;)。接着我实现了willShowViewController方法,它可以正常工作,但是当视图控制器从堆栈中弹出时,会发生内存泄漏并导致我的应用程序崩溃。我尝试在viewDidUnloaddealloc中都使用self.navigationController.delegate = nil;,但没有起到帮助作用。

我应该如何正确地在一个视图控制器中实现这个代理?

3个回答

6

viewDidUnload 不一定会被调用(它主要用于处理低内存情况)。当 dealloc 被调用时,视图控制器可能不再包含在导航控制器中,因此 self.navigationController 将为 nil

我建议您在 viewWillDisappear: 实现中将代理设置为 nil(并在 viewWillAppear: 中设置它,而不是在 viewDidLoad 中设置)。

顺便说一句,您在这里看到的是内存泄漏的完全相反情况。内存泄漏是指无法访问且永远不会被释放的内存。在这里,您已经释放了内存(您的视图控制器),但仍由一个(悬空)指针引用,导致崩溃。真正的泄漏通常不会直接导致崩溃。


3
请记住,当另一个视图控制器被“推入”时,也会发送viewWillDisappear:消息,因此这可能不是您真正想要的。 - Costique

4

当导航控制器要弹出您的控制器时,您应该保持对其进行弱引用(非保留引用),或重置其委托。事实是,在dealloc中,self.navigationController已经为空,并且在您的控制器被弹出时不会发送viewDidUnload


0

在你的[viewDidAppear:]实现中,应该将代理设置为self,并在[viewWillDisappear:]实现中将代理设置为nil。

提示:不应该在dealloc实现中将代理设置为nil,因为当调用dealloc时,viewController从navigationcontroller堆栈中弹出,所以self.navigationController必须为nil。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接