正确分配/取消分配UINavigationControllerDelagate

时间:2012-01-12 05:13:44

标签: iphone objective-c ios cocoa-touch uinavigationcontroller

我有UIViewController需要使用UINavigationControllerDelegate,特别是willShowViewController方法。

我在我的实现中设置了<UINavigationControllerDelegate>,然后我在viewDidLoadself.navigationController.delegate = self;)中将委托设置为self。然后我实现willShowViewController方法并且它工作正常,但是当视图控制器从堆栈弹出时,存在内存泄漏并且我的应用程序崩溃。我已尝试在self.navigationController.delegate = nil;viewDidUnload中执行dealloc,但这无关紧要。

我可以在我的一个viewcontrollers中实现此委托的正确方法是什么?

3 个答案:

答案 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。