【发布时间】:2013-08-31 00:55:36
【问题描述】:
我似乎有一个很奇怪的问题。我的应用程序有一个UITabBar,可以让您选择各种视图控制器。如果在给定的选定选项卡项中,另一个视图控制器被压入堆栈,然后使用情节提要或pushViewController 或popViewController 从UINavigationController 的堆栈中弹出,当您选择另一个选项卡项时,应用程序崩溃.我对此进行了跟踪,发现有一个僵尸对象,即被推送然后弹出的视图控制器。该应用程序显然正在尝试向其发送消息。这是日志消息。
*** -[UserInputViewController respondsToSelector:]: message sent to deallocated instance 0xa5f0620
一旦视图控制器从堆栈中弹出并可能被释放,我在我的代码中看不到任何地方我正在访问视图控制器,并且在单击选项卡栏项目时我不做任何特殊处理。事实上它在
之前就崩溃了 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
甚至被调用。似乎标签栏仍然以某种方式认为该视图控制器已分配并在堆栈上,否则它为什么会尝试向其发送消息?
非常感谢任何帮助。
【问题讨论】:
-
两个问题。您使用的是独立的标签栏还是标签栏控制器?其次,您这样说:“使用任一故事板 segues 弹出 UINavigationController 的堆栈......”您是否使用 segue 弹出视图控制器?
-
我正在使用标签栏控制器,我尝试使用 segue 和以编程方式弹出视图控制器。无论哪种方式,它都崩溃了,但事实证明这不是问题所在。我不小心将该视图控制器指定为选项卡栏控制器的委托(我正在使用一个错误地执行此操作的基本视图控制器类。)当我改变它时,崩溃就消失了。解决方案在这里stackoverflow.com/questions/14927677/…
-
在任何情况下,您都不应该使用 segue 弹出视图控制器,除非您使用的是 unwind segue。
-
是的,谢谢,你说得对。我只是想尝试这两种方法,看看其中一种是否导致了问题。事实证明这与此无关。
标签: ios cocoa-touch uiviewcontroller uitabbarcontroller nszombie