【问题标题】:UINavigation Controller Memory IssueUINavigation 控制器内存问题
【发布时间】:2011-11-11 11:56:00
【问题描述】:

由于不存在视图控制器,我的应用程序崩溃了。在升级到最新版本的 Xcode 并获得正确符号化的设备日志后,我的怀疑得到了证实。单击页面上的后退按钮后,会调用 popviewcontroller 并且应用程序崩溃。这是来自我的系统的确切错误报告:

Thread 0 Crashed:
0   libobjc.A.dylib                 0x341fcc98 0x341fa000 + 11416
1   libobjc.A.dylib                 0x34206506 0x341fa000 + 50438
2   libobjc.A.dylib                 0x341fe040 0x341fa000 + 16448
3   Holler                          0x00010a06 0x1000 + 64006
4   Holler                          0x0000e504 0x1000 + 54532
5   UIKit                           0x00036f08 -[UIViewController view] + 104
6   UIKit                           0x000455e8 -[UIViewController contentScrollView] + 16
7   UIKit                           0x00045458 -[UINavigationController _computeAndApplyScrollContentInsetDeltaForViewController:] + 24
8   UIKit                           0x00045356 -[UINavigationController _layoutViewController:] + 18
9   UIKit                           0x00044e2e -[UINavigationController _startTransition:fromViewController:toViewController:] + 374
10  UIKit                           0x00044c3c -[UINavigationController _startDeferredTransitionIfNeeded] + 176
11  UIKit                           0x00044b80 -[UINavigationController viewWillLayoutSubviews] + 8
12  UIKit                           0x00044b1c -[UILayoutContainerView layoutSubviews] + 132
13  UIKit                           0x000055f4 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 20
14  CoreFoundation                  0x0000befc -[NSObject(NSObject) performSelector:withObject:] + 16

据我了解,UINavigationController 保留其堆栈中所有视图控制器的所有权。然而,出于某种原因,我的一个视图控制器正在消失。我要确认的是 UINavigationController 实际上确实会持续保留其视图控制器。

我只能在很长一段时间后让它崩溃(我去睡觉,重新加载应用程序并单击“返回”,然后应用程序崩溃)。是否有一些与 UINavigationController 的生命周期相关的东西或者我需要知道的那些方面的东西?有人对如何开始缩小问题范围有任何想法吗?

我假设简单的答案是我过度发布了一个视图控制器,当我点击返回时它不再存在。但是我想得到一些其他成员的意见。想法?

【问题讨论】:

    标签: objective-c ios xcode cocoa-touch xcode4


    【解决方案1】:

    是的UINavigationController 保留了堆栈中的UIViewController。 (实际上它保留了一堆UINavigationItems,其中包含一些关于标题、后退按钮等的数据......以及 ViewController 本身)

    我猜你的问题不在于UIViewController 本身,而在于你的内存管理。

    不要忘记例如viewDidUnload 方法中将 IBOutlets 设置为 nil,这样当您的应用收到 memoryWarning 并释放不在屏幕上的视图时(通常是附加到 ViewControllers 的视图这不是 UINavigationController 的最顶层 viewController),您的 IBOutlets 停止指向不再存在的对象和视图(可能导致崩溃,因为您的应用程序随后尝试访问已被释放的内存)


    PS:请注意,您的崩溃日志并不完全是符号化的,最有趣的部分(对应于“Holler”应用程序中您自己的代码的部分)仍然表示为方法的地址而不是方法名称。 .. 这将有助于您了解崩溃真正发生在代码的哪个方法中,可能是viewWillAppearviewDidLoad 之类的方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      相关资源
      最近更新 更多