ios Xcode调试-奇怪的错误-取消视图控制器



在过去的几天里,我真的很头疼,因为我的应用程序中有一个bug,似乎是随机出现的!我想我会在这里问一下,看看是否有人有过类似的经历。

加载某个视图控制器时,应用程序正在崩溃。但这种情况似乎每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

如有任何帮助,我们将不胜感激!

取消呈现的视图控制器

当需要关闭呈现的视图控制器时首选方法是让呈现视图控制器忽略换句话说,只要可能视图控制器还应负责驳回它。尽管有几种技术可以通知呈现视图控制器,其呈现的视图控制器应该如果被解雇,首选的技术是委派。了解更多信息有关信息,请参阅"使用委派与他人沟通控制器。"

请确保您不会在该视图控制器中解雇您的视图控制器(根据文档)。最好的方法是在使用委托之外解除viewController。"使用委派与其他控制器通信。"

尝试使用

if (![self.presentedViewController isBeingPresented]) {
}

我认为这与模态/呈现视图控制器根本没有联系。

从堆栈跟踪来看,只有一件事是清楚的——这是一个典型的异常,因为在同时枚举集合中的对象时更改了对象。在这种情况下,集合可能是子视图的集合(您的主线程正在枚举它们)。

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

最新更新