我有UIViewController
需要使用UINavigationControllerDelegate
,特别是willShowViewController
方法。
我在我的实现中设置了<UINavigationControllerDelegate>
,然后我在viewDidLoad
(self.navigationController.delegate = self;
)中将委托设置为self。然后我实现willShowViewController
方法并且它工作正常,但是当视图控制器从堆栈弹出时,存在内存泄漏并且我的应用程序崩溃。我已尝试在self.navigationController.delegate = nil;
和viewDidUnload
中执行dealloc
,但这无关紧要。
我可以在我的一个viewcontrollers中实现此委托的正确方法是什么?
答案 0 :(得分:6)
viewDidUnload
不一定会被调用(它主要用于处理低内存条件),并且在调用dealloc
时,视图控制器可能不再包含在导航控制器中,因此{ {1}}将是self.navigationController
。
我建议您在nil
实施中将代理设置为nil
(并将其设置为viewWillDisappear:
而不是viewWillAppear:
)。
答案 1 :(得分:4)
当导航控制器显示导航控制器将弹出控制器时,您应该保留对导航控制器的弱(非保留)引用或重置其委托。事实是,dealloc
self.navigationController
已经为零,并且当您的控制器弹出时,viewDidUnload
不会被发送。
答案 2 :(得分:0)
您应该在[viewDidAppear:]
实施中将委托设置为self,并在[viewWillDisappear:]
实施中将委托设置为nil。
提示:你不应该在dealloc实现中将委托设置为nil,因为当调用dealloc时,viewController会从navigationcontroller堆栈中弹出,因此self.navigationController必须为nil。