Xcode升级后iOS项目抛出未处理的异常
Posted
技术标签:
【中文标题】Xcode升级后iOS项目抛出未处理的异常【英文标题】:iOS Project throws unhandled exception after Xcode upgrade 【发布时间】:2015-10-12 21:07:30 【问题描述】:我正在开发一个 PhoneGap 应用程序。该应用程序本身似乎已经很好地处理了 ios 9,因为它仍然可以工作,但是向新 Xcode 的过渡引入了一个新异常,该异常在旧版本的 Xcode 下没有发生。
我收到以下异常文本:
2015-10-12 13:40:58.434 <AppName>[29769:897739] -[__NSDictionaryI length]: unrecognized selector sent to instance 0x7ff0295c95d0
2015-10-12 13:40:58.445 <AppName>[29769:897739] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSDictionaryI length]: unrecognized selector sent to instance 0x7ff0295c95d0'
*** First throw call stack:
(
0 CoreFoundation 0x000000010d24bf65 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x000000011061fdeb objc_exception_throw + 48
2 CoreFoundation 0x000000010d25458d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x000000010d1a1f7a ___forwarding___ + 970
4 CoreFoundation 0x000000010d1a1b28 _CF_forwarding_prep_0 + 120
5 UIKit 0x000000010d857011 -[UILabel _ensureBaselineMetricsReturningBounds] + 153
6 UIKit 0x000000010d85725e -[UILabel _firstBaselineOffsetFromTop] + 36
7 UIKit 0x000000010de7d0c3 -[UIView(AdditionalLayoutSupport) nsli_lowerAttribute:intoExpression:withCoefficient:forConstraint:onBehalfOfLayoutGuide:] + 1560
8 UIKit 0x000000010de7ca8f -[UIView(AdditionalLayoutSupport) nsli_lowerAttribute:intoExpression:withCoefficient:forConstraint:] + 74
9 Foundation 0x00000001101f3bd8 lower_1_attribute + 158
10 Foundation 0x00000001101f36ec -[NSLayoutConstraint _lowerIntoExpression:reportingConstantIsRounded:] + 102
11 Foundation 0x00000001101e98f1 -[NSLayoutConstraint _addToEngine:integralizationAdjustment:mutuallyExclusiveConstraints:] + 96
12 UIKit 0x000000010de79213 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 504
13 Foundation 0x00000001101f723a -[NSISEngine withBehaviors:performModifications:] + 155
14 UIKit 0x000000010de79637 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 58
15 UIKit 0x000000010de78fd3 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 646
16 UIKit 0x000000010de79640 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 67
17 UIKit 0x000000010de78d08 -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 242
18 UIKit 0x000000010de790fc __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 225
19 Foundation 0x00000001101f723a -[NSISEngine withBehaviors:performModifications:] + 155
20 UIKit 0x000000010de79637 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 58
21 UIKit 0x000000010de78fd3 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 646
22 UIKit 0x000000010de79640 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 67
23 UIKit 0x000000010de78d08 -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 242
24 UIKit 0x000000010d6b2fef -[UIScrollView _switchToLayoutEngine:] + 107
25 UIKit 0x000000010de790fc __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 225
26 Foundation 0x00000001101f723a -[NSISEngine withBehaviors:performModifications:] + 155
27 UIKit 0x000000010de79637 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 58
28 UIKit 0x000000010de78fd3 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 646
29 UIKit 0x000000010de79640 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 67
30 UIKit 0x000000010de78d08 -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 242
31 UIKit 0x000000010de790fc __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 225
32 Foundation 0x00000001101f723a -[NSISEngine withBehaviors:performModifications:] + 155
33 UIKit 0x000000010de79637 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 58
34 UIKit 0x000000010de78fd3 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 646
35 UIKit 0x000000010de79640 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 67
36 UIKit 0x000000010de78d08 -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 242
37 UIKit 0x000000010de790fc __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 225
38 Foundation 0x00000001101f723a -[NSISEngine withBehaviors:performModifications:] + 155
39 UIKit 0x000000010de79637 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 58
40 UIKit 0x000000010de78fd3 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 646
41 UIKit 0x000000010de79640 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 67
42 UIKit 0x000000010de78d08 -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 242
43 UIKit 0x000000010de790fc __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke_2 + 225
44 Foundation 0x00000001101f723a -[NSISEngine withBehaviors:performModifications:] + 155
45 UIKit 0x000000010de79637 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 58
46 UIKit 0x000000010de78fd3 __57-[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:]_block_invoke + 646
47 UIKit 0x000000010de79640 -[UIView(AdditionalLayoutSupport) _withAutomaticEngineOptimizationDisabledIfEngineExists:] + 67
48 UIKit 0x000000010de78d08 -[UIView(AdditionalLayoutSupport) _switchToLayoutEngine:] + 242
49 UIKit 0x000000010d6980dc __45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 113
50 Foundation 0x00000001101f723a -[NSISEngine withBehaviors:performModifications:] + 155
51 UIKit 0x000000010d698024 -[UIView(Hierarchy) _postMovedFromSuperview:] + 575
52 UIKit 0x000000010d6a5ac3 -[UIView(Internal) _addSubview:positioned:relativeTo:] + 1967
53 UIKit 0x000000010d8e7695 -[_UIAlertControllerPresentationController presentationTransitionWillBegin] + 208
54 UIKit 0x000000010d75999c __71-[UIPresentationController _initViewHierarchyForPresentationSuperview:]_block_invoke + 2044
55 UIKit 0x000000010d7575c5 __56-[UIPresentationController runTransitionForCurrentState]_block_invoke + 309
56 UIKit 0x000000010d6044be _runAfterCACommitDeferredBlocks + 317
57 UIKit 0x000000010d6167ee _cleanUpAfterCAFlushAndRunDeferredBlocks + 95
58 UIKit 0x000000010d6224e6 _afterCACommitHandler + 90
59 CoreFoundation 0x000000010d1779d7 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
60 CoreFoundation 0x000000010d177947 __CFRunLoopDoObservers + 391
61 CoreFoundation 0x000000010d16d59b __CFRunLoopRun + 1147
62 CoreFoundation 0x000000010d16ce98 CFRunLoopRunSpecific + 488
63 GraphicsServices 0x0000000111d12ad2 GSEventRunModal + 161
64 UIKit 0x000000010d5f8676 UIApplicationMain + 171
65 <AppName> 0x000000010cd9c061 main + 65
66 libdyld.dylib 0x0000000110ff192d start + 1
67 ??? 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb)
查看代码,它向我显示以下作为异常的来源:
int main(int argc, char* argv[])
@autoreleasepool
int retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate");
return retVal;
除了来自UIApplicationMain()
调用的异常。沿着堆栈跟踪进一步向下只是将我带到汇编代码,这似乎是 Apple 库。
我基本上可以肯定代码问题与UIApplicationMain(
) 直接调用无关,并且可能是项目文件中的其他内容已损坏,但我无法找到线索来追踪这个我一生的错误。
如果我在 Xcode 6.0 或 6.3(我尝试过的其他两个版本)中加载同一个项目,此时不会引发异常。即使是商店里的编译应用,在 iOS 9 中测试时,似乎也没有这个问题。到目前为止,该问题似乎只在通过 Xcode 7.0 以调试模式运行应用程序时出现。
Config.xml
指定使用 phonegap-version 3.5 构建它,但我尝试了其他版本,直到最新,所有版本都有这个问题。
我已经尝试解决这个问题两天了,但我没有取得任何进展,因为我无法掌握可能出了什么问题。我最终检查的一切似乎都很好,但是这个错误是从某个地方出现的。我觉得这一定是某处配置错误的情况,因此无论最终使用错误配置的部分,它都会在 Apple 的代码中爆炸,但我完全不知道是什么。我难住了。有没有人有任何有用的信息可以帮助我?
更新:我终于找到了。隐藏在调试输出中的是我忽略的一行:
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802
这让我找到了this question here on SO。事实证明,这是我的问题的真正根本原因。这也解释了为什么应用程序在实际设备上的生产环境中运行良好,以及为什么旧的 Xcode 也很好。在生产中发出的 Web 请求是针对 HTTPS 发出的,但用于开发的服务器是 HTTP。因此,应用程序的生产版本很好,应用程序的开发版本在旧 Xcode(没有 ATS)中很好,但是针对新的 iOS 9 Xcode 编译的应用程序的开发版本抛出异常。
我忙于查看调试输出中的大异常和其他一些主要项目,以至于我错过了夹在其他项目之间的关键行。
【问题讨论】:
使用异常断点运行应用程序时会发生什么? developer.apple.com/library/ios/recipes/… 几乎是一样的。它仍然停止并将我指向同一 UIApplicationMain() 行,堆栈跟踪的最后一部分似乎没有处理异常处理是:[UILabel _ensureBaselineMetricsReturningBounds] + 153
异常跟踪中进一步向上的项目是:__forwarding_prep_0___ ___forwarding___ -[NSObject(NSObject) doesNotRecognizeSelector:] objc_exception_throw
如果我继续过去,它会捕获另一个异常,这会将堆栈中的这些项目向下推:` __cxa_throw` 抱歉,我一直按 Enter 而不是 shift+enter。
【参考方案1】:
向新 Xcode 的过渡引入了一个新异常
新版本的 Xcode 通常带有新的框架。与其说是 Xcode 本身导致了异常,不如说是您的代码所做的某些事情以前是允许的,但在最新版本的框架中引发了异常。
从堆栈跟踪中可以清楚地看出异常发生在自动布局系统执行其操作时。查看您的故事板,看看是否有任何布局问题需要解决。此外,查看控制台中的消息——那里通常可以找到导致异常的线索。
【讨论】:
控制台中有一条消息,我不知何故忽略了,这导致了我的解决方案。谢谢。 从 xcode 8 升级到 xcode 9 后,我遇到了类似的问题。我意识到我的一个故事板的构建目标是 iOS 11,整个项目的最小部署目标是 iOS 10。我们在 iOS 10 设备上看到了这些异常。理论上,这可能是因为 iOS 11 可能引入了 iOS 10 不可用的新方法,导致 iOS 10 设备上出现 doesNotRecognizeSelector 异常。以上是关于Xcode升级后iOS项目抛出未处理的异常的主要内容,如果未能解决你的问题,请参考以下文章
C++ Battle4Zion 项目抛出未处理的异常:读取访问冲突。 **this** 是 nullptr。发生了
升级到 Xcode 4.2/iOS 5 后,类别中的方法引发异常