UINavigationController内存问题

时间:2011-09-06 16:28:55

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

由于不存在视图控制器,我的应用程序崩溃了。在升级到最新版本的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的生命周期有关的事情或者我需要了解的那些内容?有人对如何开始缩小问题有任何想法吗?

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

1 个答案:

答案 0 :(得分:1)

UINavigationController保留其堆栈中的UIViewController。 (实际上它保留了一堆UINavigationItems,其中包含有关标题,backButton等的一些数据......以及ViewController本身)

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

不要忘记例如viewDidUnload方法中将您的IBOutlets设置为nil,以便当您的应用收到内存警告并释放不在屏幕上的视图时(通常是附加的视图)对于不是UINavigationController的最顶层viewController的ViewControllers,你的IBOutlets停止指向不再存在的objets和视图(可能导致崩溃,因为你的应用程序尝试访问已经解除分配的内存)


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