在iOS中自动旋转崩溃

当我正在改变设备方向时,我正在与正在使用的应用程序发生exception终止(崩溃)。 我无法经常重现(当我旋转的时候并不总是这样,假设机会在0.01%左右),但这是一个严重的问题。 我附上了崩溃报告的重要部分。

Exception Type: EXC_BAD_ACCESS (SIGSEGV) Exception Codes: KERN_INVALID_ADDRESS at 0x6563616e Crashed Thread: 0 Thread 0 name: Dispatch queue: com.apple.main-thread Thread 0 Crashed: 0 libobjc.A.dylib 0x3233a5b0 objc_msgSend + 16 1 UIKit 0x36297b82 -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] + 1546 2 UIKit 0x3628301e -[UITableViewRowData rectForFooterInSection:] + 310 3 UIKit 0x3628358c -[UITableViewRowData heightForTable] + 48 4 UIKit 0x36283400 -[UITableView(_UITableViewPrivate) _updateContentSize] + 324 5 UIKit 0x362cc8b4 -[UITableView _rectChangedWithNewSize:oldSize:] + 252 6 UIKit 0x362cc544 -[UITableView setFrame:] + 220 7 UIKit 0x362c59c4 -[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize:] + 644 8 UIKit 0x362c572e -[UIView(Geometry) _resizeWithOldSuperviewSize:] + 262 9 UIKit 0x3644eb2a -[UIScrollView _resizeWithOldSuperviewSize:] + 38 10 CoreFoundation 0x35b63aec __NSArrayChunkIterate + 360 11 CoreFoundation 0x35b5ca74 __NSArrayEnumerate + 608 12 CoreFoundation 0x35abeb66 -[NSArray enumerateObjectsWithOptions:usingBlock:] + 58 13 UIKit 0x3627e09e -[UIView(Geometry) resizeSubviewsWithOldSize:] + 114 14 UIKit 0x36263ba2 -[UIView(Geometry) setFrame:] + 414 15 UIKit 0x362c59c4 -[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize:] + 644 16 UIKit 0x362c572e -[UIView(Geometry) _resizeWithOldSuperviewSize:] + 262 17 CoreFoundation 0x35b63aec __NSArrayChunkIterate + 360 18 CoreFoundation 0x35b5ca74 __NSArrayEnumerate + 608 19 CoreFoundation 0x35abeb66 -[NSArray enumerateObjectsWithOptions:usingBlock:] + 58 20 UIKit 0x3627e09e -[UIView(Geometry) resizeSubviewsWithOldSize:] + 114 21 UIKit 0x36263ba2 -[UIView(Geometry) setFrame:] + 414 22 UIKit 0x362a6dc0 -[UIViewControllerWrapperView setFrame:] + 48 23 UIKit 0x362c59c4 -[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize:] + 644 24 UIKit 0x362c572e -[UIView(Geometry) _resizeWithOldSuperviewSize:] + 262 25 CoreFoundation 0x35b63aec __NSArrayChunkIterate + 360 26 CoreFoundation 0x35b5ca74 __NSArrayEnumerate + 608 27 CoreFoundation 0x35abeb66 -[NSArray enumerateObjectsWithOptions:usingBlock:] + 58 28 UIKit 0x3627e09e -[UIView(Geometry) resizeSubviewsWithOldSize:] + 114 29 UIKit 0x36263ba2 -[UIView(Geometry) setFrame:] + 414 30 UIKit 0x362c59c4 -[UIView(Geometry) _applyAutoresizingMaskWithOldSuperviewSize:] + 644 31 UIKit 0x362c572e -[UIView(Geometry) _resizeWithOldSuperviewSize:] + 262 32 CoreFoundation 0x35b63aec __NSArrayChunkIterate + 360 33 CoreFoundation 0x35b5ca74 __NSArrayEnumerate + 608 34 CoreFoundation 0x35abeb66 -[NSArray enumerateObjectsWithOptions:usingBlock:] + 58 35 UIKit 0x3627e09e -[UIView(Geometry) resizeSubviewsWithOldSize:] + 114 36 UIKit 0x362c64ae -[UIView(Geometry) setBounds:] + 430 37 UIKit 0x3634ff32 -[UILayoutContainerView setBounds:] + 58 38 UIKit 0x363edd88 -[UIViewController window:willAnimateRotationToInterfaceOrientation:duration:] + 460 39 UIKit 0x3630e2b0 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:isRotating:] + 3616 40 UIKit 0x3630d482 -[UIWindow _setRotatableClient:toOrientation:updateStatusBar:duration:force:] + 42 41 UIKit 0x3630d40c -[UIWindow _setRotatableViewOrientation:duration:force:] + 64 42 UIKit 0x3644317c __57-[UIWindow _updateToInterfaceOrientation:duration:force:]_block_invoke_0 + 100 43 UIKit 0x362cb676 -[UIWindow _updateToInterfaceOrientation:duration:force:] + 214 44 UIKit 0x362d4d20 -[UIWindow _updateInterfaceOrientationFromDeviceOrientation:] + 176 45 CoreFoundation 0x35ab9034 _CFXNotificationPost + 1424 46 Foundation 0x3721bd8c -[NSNotificationCenter postNotificationName:object:userInfo:] + 68 47 UIKit 0x36268c60 -[UIDevice setOrientation:animated:] + 292 48 UIKit 0x362633d6 -[UIApplication handleEvent:withNewEvent:] + 2954 49 UIKit 0x362626c8 -[UIApplication sendEvent:] + 68 50 UIKit 0x36262116 _UIApplicationHandleEvent + 6150 51 GraphicsServices 0x318885a0 _PurpleEventCallback + 588 52 GraphicsServices 0x318881ce PurpleEventCallback + 30 53 CoreFoundation 0x35b3d170 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 32 54 CoreFoundation 0x35b3d112 __CFRunLoopDoSource1 + 134 55 CoreFoundation 0x35b3bf94 __CFRunLoopRun + 1380 56 CoreFoundation 0x35aaeeb8 CFRunLoopRunSpecific + 352 57 CoreFoundation 0x35aaed44 CFRunLoopRunInMode + 100 58 GraphicsServices 0x318872e6 GSEventRunModal + 70 59 UIKit 0x362b62f4 UIApplicationMain + 1116 

既不涉及线程活动,也不涉及ViewController。 而且,我正在使用ARC。

我想知道原因的确切原因,或者在自转发生时导致崩溃的可能性。

提前致谢…

我认为应用程序发送消息到释放对象。 是的,有时甚至在使用ARC时也会发生。 要debugging它,你需要运行你的应用程序(僵尸),并尝试重现错误。

启用僵尸和仪器(僵尸)debugging应用程序确实帮助find错误。 但是修复这个bug或者避免将来出现同样的错误真的很重要。

在我的代码中,我有一个像这样的实现…

 - (void)someMethod { [self.navigationController pushViewController:[DestinationViewController new] animated:YES]; } 

那里我们没有直接持有DestinationViewController的强大的参考。 但是改变…

 @property (strong, nonatomic) DestinationViewController *dvc; // .... - (void)someMethod { self.dvc = [DestinationViewController new]; [self.navigationController pushViewController:self.dvc animated:YES]; } 

已经帮助避免了这个错误。 我无法真正解释为什么…? 但我希望改变设备的方向会影响DestinationViewController,但是通过保持强引用可以避免这种情况。