Iphone 正确分配/取消分配UINavigationControllerDelagate

Iphone 正确分配/取消分配UINavigationControllerDelagate,iphone,objective-c,ios,cocoa-touch,uinavigationcontroller,Iphone,Objective C,Ios,Cocoa Touch,Uinavigationcontroller,我有一个UIViewController,需要使用UINavigationControllerDelegate,特别是willShowViewController方法 我在实现中设置,然后在viewDidLoad中将委托设置为self(self.navigationController.delegate=self;)。然后我实现了willShowViewController方法,它工作正常,但是当视图控制器从堆栈中弹出时,内存泄漏,我的应用程序崩溃。我试过做self.navigationCont

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

我在实现中设置
,然后在
viewDidLoad
中将委托设置为self(
self.navigationController.delegate=self;
)。然后我实现了
willShowViewController
方法,它工作正常,但是当视图控制器从堆栈中弹出时,内存泄漏,我的应用程序崩溃。我试过做self.navigationController.delegate=nil在
viewDidUnload
dealloc
中都有,但这对问题没有帮助


在我的一个ViewController中使用此委托的正确方法是什么?

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

我建议在
视图中将委托设置为
nil
将消失:
实现(并在
视图中将其设置为:
而不是
viewDidLoad


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

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

您应该在
[ViewDidDisplay:][/code>实现中设置委托为self,并在
中设置委托为零。[ViewWillEnglish:]
实现


提示:在Dealoc实现中不应将委托设置为nil,因为调用Dealoc时,viewController会从navigationcontroller堆栈中弹出,因此self.navigationcontroller必须为nil。

请记住,
ViewWillEnglish:
在推送另一个视图控制器时也会发送,所以这可能不是你真正想要的。