【问题标题】:EXC_BAD_ACCESS when popViewControllerAnimated in navigation based application在基于导航的应用程序中 popViewControllerAnimated 时的 EXC_BAD_ACCESS
【发布时间】:2023-03-13 01:48:01
【问题描述】:

我无法弄清楚为什么在导航堆栈中弹回上一个视图控制器时会崩溃。 问题是我正在使用自定义导航栏(原始导航栏被隐藏,我的自定义按钮触发导航 - 推送和弹出 - 代替)。

我得到的踪迹:

Program received signal:  “EXC_BAD_ACCESS”.

#0  0x011a4a60 in objc_msgSend
#1  0x0044e37c in -[UIImageView(UIImageViewInternal) _canDrawContent]
#2  0x003bf3df in -[UIView(Internal) _didMoveFromWindow:toWindow:]
#3  0x003bf1b0 in -[UIView(Internal) _didMoveFromWindow:toWindow:]
#4  0x003bf1b0 in -[UIView(Internal) _didMoveFromWindow:toWindow:]
#5  0x003bdfc4 in -[UIView(Hierarchy) _postMovedFromSuperview:]
#6  0x003b6dfc in -[UIView(Internal) _addSubview:positioned:relativeTo:]
#7  0x003b514f in -[UIView(Hierarchy) addSubview:]
#8  0x005ca471 in -[UINavigationTransitionView transition:fromView:toView:]
#9  0x005c9ed5 in -[UINavigationTransitionView transition:toView:]
#10 0x0043c606 in -[UINavigationController _startDeferredTransitionIfNeeded]
#11 0x0043c292 in -[UINavigationController _popViewControllerWithTransition:allowPoppingLast:]
#12 0x0043bfa9 in -[UINavigationController popViewControllerWithTransition:]
#13 0x0043f62b in -[UINavigationController popToViewController:transition:]
#14 0x000124fa in -[BaseViewController bottomNavigationFiredController:] at BaseViewController.m:187

【问题讨论】:

  • 请把相关代码也贴出来。
  • 你设置了 NSZombieEnabled 了吗?你用过静态分析器吗?
  • 是的,这是启用了僵尸的堆栈。没有太多的描述性。我已经意识到,很可能正在发布控制器被推开的视图。因此,即使控制器本身被保存在导航的控制器堆栈中,它的所有子视图的视图也会被释放。在我的情况下,严重发布的 uiimageview 导致了崩溃。

标签: iphone uinavigationcontroller crash navigation popviewcontroller


【解决方案1】:

值得记住的是,当视图控制器在导航堆栈中被推开时(新视图控制器被推入),即使它本身没有被释放(保留它在导航控制器堆栈中),它的主要视图正在被已发布(当然还有它的所有子视图)。

所以这种类型的崩溃主要指向内存管理的 UI 部分(很可能是自动释放的 UIImages 的双重释放,这是我的情况;-)。

希望它可以帮助人们了解 UINavigationController 如何管理内存。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题,可能是因为您的最后一个视图不再保留。最好的方法是尝试通过制作属性并合成它来保留您之前的视图。

    那就试试用

    [self.navigationConroller popViewControllerAnimated:YES];
    

    或弹出到所需的视图

    [self.navigationController popToViewController:myview animated:YES];
    

    或弹出到根视图

    [self.navigationController popToRootViewControllerAnimated:YES];
    

    如果对您有帮助,请告诉我。因为当您尝试转到已发布的视图时会出现此错误。

    【讨论】:

    • 我发现这是一些已发布的 UIImage 导致崩溃。我不知道控制器被“推”开的视图正在释放。我认为 uinavigationcontroller 将其保留在堆栈中。
    • 好的,所以你终于找到了。好吧,如果我的回答对你有帮助,那么别忘了给我的回答投票。谢谢亲爱的..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    相关资源
    最近更新 更多