由于不存在视图控制器,我的应用程序崩溃了。在升级到最新版本的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的生命周期有关的事情或者我需要了解的那些内容?有人对如何开始缩小问题有任何想法吗?
我假设简单的答案是我已经过度发布了一个视图控制器,当我点击它时它就不再存在了。但是我想得到其他成员的意见。想法?
答案 0 :(得分:1)
是UINavigationController
保留其堆栈中的UIViewController
。 (实际上它保留了一堆UINavigationItems
,其中包含有关标题,backButton等的一些数据......以及ViewController本身)
我猜你的问题不在UIViewController
本身,而在于你的记忆管理。
不要忘记例如在viewDidUnload
方法中将您的IBOutlets设置为nil,以便当您的应用收到内存警告并释放不在屏幕上的视图时(通常是附加的视图)对于不是UINavigationController
的最顶层viewController的ViewControllers,你的IBOutlets停止指向不再存在的objets和视图(可能导致崩溃,因为你的应用程序尝试访问已经解除分配的内存)
PS:请注意,您的崩溃日志并非完全符号化,最有趣的部分(与“Holler”应用程序中您自己的代码相对应的部分)仍然表示为方法的地址而不是方法名称。 ..这可以帮助你了解崩溃真正发生在你的代码的哪种方法,可能是某些方法,如viewWillAppear
或viewDidLoad