ios Xcode调试 - 奇怪的错误 - 解散View Controller

时间:2013-07-02 13:45:56

标签: ios objective-c debugging

在过去的几天里,我一直在撕扯我的头发,因为我的应用程序中有一个似乎随机出现的错误!我想我会在这里询问是否有人有类似的经历。

当加载某个视图控制器时,应用程序正在崩溃。但这似乎只发生在每25-30次中的1次 - 所以它对我来说似乎完全随机!

控制台显示以下错误

Warning: Attempt to dismiss from view controller <UINavigationController: 0x1f025c30> while a presentation or dismiss is in progress! 

该应用程序随后崩溃。

但是,实际上没有任何代码可以解除此视图控制器 - 我使用JASidepanels(https://github.com/gotosleep/JASidePanels)但是这个错误只发生在一个视图中。因为没有代码可以解雇它,我真的不确定这是怎么回事。 (JASidepanels幻灯片并隐藏此面板 - 但在视图加载时不会调用此方法)

下面是符号化的崩溃报告 - 我真的在这里找不到太多用处:

Incident Identifier: 8E0C4F14-1B7B-4241-A1D3-37AD55F3D432
CrashReporter Key:   fb5a345eac1c4c3ba4fbe6158b1d6af5833f137e
Hardware Model:      iPad2,7
Process:         appName [7665]
Path:            /var/mobile/Applications/130C6C0F-40E0-4EE7-AD2A-F7CFCFD6C462/appName.app/appName
Identifier:      appName
Version:         ??? (???)
Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2013-07-02 14:24:24.588 +0100
OS Version:      iOS 6.1.3 (10B329)
Report Version:  104

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Crashed Thread:  9

Last Exception Backtrace:
0   CoreFoundation                  0x32f5729e __exceptionPreprocess + 158
1   libobjc.A.dylib                 0x3ae1297a objc_exception_throw + 26
2   CoreFoundation                  0x32f56d80 __NSFastEnumerationMutationHandler + 124
3   UIKit                           0x34d6ff92 -[UIView(Hierarchy) subviews] + 326
4   UIKit                           0x34d7b04a -[UIView(Geometry) resizeSubviewsWithOldSize:] + 22
5   UIKit                           0x3519cc28 -[UIView(AdditionalLayoutSupport) _is_layout] + 112
6   UIKit                           0x34d68a8c -[UIView(Hierarchy) layoutSubviews] + 68
7   UIKit                           0x34d627fe -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 254
8   QuartzCore                      0x34b0cd86 -[CALayer layoutSublayers] + 210
9   QuartzCore                      0x34b0c924 CA::Layer::layout_if_needed(CA::Transaction*) + 456
10  QuartzCore                      0x34b0d858 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 12
11  QuartzCore                      0x34b0d23e CA::Context::commit_transaction(CA::Transaction*) + 234
12  QuartzCore                      0x34b0d04c CA::Transaction::commit() + 312
13  QuartzCore                      0x34b0ceac CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned      long, void*) + 56
14  CoreFoundation                  0x32f2c6c8 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 16
15  CoreFoundation                  0x32f2a9bc __CFRunLoopDoObservers + 272
16  CoreFoundation                  0x32f2ad12 __CFRunLoopRun + 738
17  CoreFoundation                  0x32e9deb8 CFRunLoopRunSpecific + 352
18  CoreFoundation                  0x32e9dd44 CFRunLoopRunInMode + 100
19  GraphicsServices                0x36a692e6 GSEventRunModal + 70
20  UIKit                           0x34db32fc UIApplicationMain + 1116
21  appName                         0x0009c1a2 main (main.m:16)
22  libdyld.dylib                   0x3b249b1c start + 0

线程9 - 崩溃了:

Thread 9 Crashed:
0   libsystem_kernel.dylib          0x3b310d98 __workq_kernreturn + 8
1   libsystem_c.dylib               0x3b25ecf6 _pthread_workq_return + 14
2   libsystem_c.dylib               0x3b25ea12 _pthread_wqthread + 362
3   libsystem_c.dylib               0x3b25e8a0 start_wqthread + 4

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

  

解雇呈现的视图控制器

     

当解雇一个呈现的视图控制器时,   首选方法是让呈现视图控制器解除   它。换句话说,只要有可能,就是相同的视图控制器   提出视图控制器也应该承担责任   解雇它。虽然有几种技术可以通知   呈现视图控制器,其呈现的视图控制器应该   被解雇,首选技术是委托。更多   信息,请参阅“使用委派与其他人沟通”   控制器“。

确保您不要在此viewcontroller中关闭viewController(根据文档)。解决viewController外部使用委托的最佳方法。 “Using Delegation to Communicate with Other Controllers.”

答案 1 :(得分:0)

尝试使用

if (![self.presentedViewController isBeingPresented]) {

}

答案 2 :(得分:0)

我根本不认为这与模态/呈现的视图控制器有关。

从堆栈跟踪中只有一件事是清楚的 - 它是一个典型的异常,它是由同时更新集合中的对象而同时枚举它们引起的。在这种情况下,集合可能是子视图(您的主要线程是枚举它们)。

通常的原因之一是从辅助线程(而不是主线程)更新视图层次结构。