poptorootviewcontroller不按顺序调用rootview控制器的dealloc方法和viewdidar方法

我有一个导航控制器与4个VC推入它。 我有一个委托属性的单身人士课程设置为位于堆栈顶部的VC。 我将这个委托设置为每个VC的dealloc方法中的零。 我在rootVC的viewdidappear方法中设置委托。

当我从第四个VCpopup回到根VC时,调用dealloc方法(栈中所有VC)和viewdidappear方法的顺序如下:

"FirstVC dealloc called" "SecondVC dealloc called" "viewdidappear of root VC is called" "ThirdVC dealloc called" 

现在,我面临的问题是委托被设置为零,即使我把它设置为自己在根VC的viewdidappear方法(这是从控制stream也可见)。 我怎样才能防止这种情况? 一旦所有的VC真的被释放,我想要调用viewdidappear方法。

谢谢,Obaid

既然你不能预测方法调用的顺序,除非苹果发布了一些保证,或许你可以通过创build一个方法来防止单身,例如:

 - (void)removeDelegate:(UIViewController *)oldDelegate; 

如果委托与指定的旧委托相匹配,则将其设置为nil。

一旦不再需要对象, dealloc会自动调用。 当你popupThirdVC ,由于委托属性仍然保留它, dealloc不会被调用。 然后,当您的rootVC的viewDidAppear被调用时,它将rootVC设置为委托。 在这一块,你的第三个VC不再需要,这触发dealloc

你可以做的一件事就是将delegate属性设置为nil而不是dealloc,而是在每个ViewControllerviewWillDisappear方法上,因为在下一个ViewController出现之前,这个方法肯定会被调用。