更新到 Xcode 5.1.1 导致 iOS 应用程序出现奇怪的崩溃

Posted

技术标签:

【中文标题】更新到 Xcode 5.1.1 导致 iOS 应用程序出现奇怪的崩溃【英文标题】:Updated to Xcode 5.1.1 causes strange crash of iOS app 【发布时间】:2014-05-01 17:38:29 【问题描述】:

不幸的是,我将 Xcode 自动更新到版本 5.1.1 (5B1008),现在我的一个应用程序以一种非常奇怪的方式崩溃了。

该应用程序是 PhoneGap 3.4 (+ jQuery Mobile 1.3.1) 混合应用程序,当我尝试打开包含 ~20 JQM 复选框的 JQM 页面时发生崩溃。

崩溃发生在WebCore WebCore::RenderThemeios::paintCheckboxDecorationsWebThread 中调用的CoreGraphics CGPathAddLineToPoint,我猜是当WebCore 尝试在JQM 页面上呈现复选框时。

控制台显示:

Assertion failed: (CGFloatIsValid(x) && CGFloatIsValid(y)), function void CGPathAddLineToPoint(CGMutablePathRef, const CGAffineTransform *, CGFloat, CGFloat), file Paths/CGPath.cc, line 224. (lldb)

任何其他不包含复选框的 JQM 页面都会正确显示,并且不会使应用程序崩溃。

编辑:有趣的是,崩溃是由这行 javascript 触发的:

$('#my_checkbox').prop("checked", my_boolean_value).checkboxradio("refresh");

如果我禁用它,则会显示 JQM 页面。但是,即使上面的行被禁用,如果我点击任何复选框,它也会再次崩溃,上面的Assertion failed 消息相同。 (我猜是因为 JQM 切换了检查/未检查类。)

我已经执行了我能想到的所有技巧(清理、禁用调试器、重新启动、重新安装 Xcode),但没有运气。

关于如何解决这个问题的任何想法?

【问题讨论】:

关于这种类型的崩溃错误,我最多能发现它只有在动画正在进行时尝试绘制时才会发生。但是,由于它是断言失败而不是未捕获的异常,因此您唯一能做的就是避免运行有问题的代码,如果代码完全位于您无法修改的库中,这可能会出现问题。如果您的崩溃错误与我的类似……那么也许某个地方正在播放可以禁用的动画?否则我无能为力;这种类型的崩溃本身就是一种邪恶。 感谢您的评论。确实,花了一天时间想明白后,我会下定决心改变我的设计,以免触发“违规”代码——因为我的应用程序是混合的,我真的无法控制 JS 之间交互的细节/CSS 和 WebCore。 我在下面“接受”我自己的答案,因为除了防止触发错误之外,没有什么可以做的。 (并希望 Apple 修复 WebCore。) They may get around to it. 【参考方案1】:

我发现了以下非常烦人的事实:崩溃是由一个

触发的
opacity:.01

指令,附加到我的 CSS 中的 JQM .ui-checkbox 类。

改成:

opacity:0

防止崩溃(我仍然不知道是由于 Xcode 错误还是 iOS 错误)。

有趣的是,将 any 值设置为大于0 会触发崩溃。

【讨论】:

虽然更改不透明度可以防止崩溃,但还有一个更深层次的问题,与使用无效上下文有关。我也遇到了同样的错误,然后是一长串与“使用无效上下文并因此导致系统稳定性和可靠性整体下降”有关的警告列表。【参考方案2】:

我遇到了类似的问题,但它是由属性文本链接引起的。我最终不得不将“继续...”更改为“继续”

【讨论】:

以上是关于更新到 Xcode 5.1.1 导致 iOS 应用程序出现奇怪的崩溃的主要内容,如果未能解决你的问题,请参考以下文章

提交到 App Store 的应用和应用更新必须使用 Xcode 5.1.1 或更高版本以及 iOS 7 SDK 构建

Xcode 7 警告!是为比被链接 (5.1) 更新的 iOS 版本 (5.1.1) 构建的

Xcode:找不到设备支持文件

带有 iOS 5.0 的 Xcode 4.2 未检测到 iPhone iOS 5.1.1

Xcode 5.1.1 归档应用程序导致构建错误

无法将App下载到iOS 5.1.1 iPhone