【问题标题】:Xcode throws an exception in Main() in iOS 8 with 'all exceptions' breakpointXcode 在 iOS 8 的 Main() 中抛出异常,并带有“所有异常”断点
【发布时间】:2014-11-25 10:42:08
【问题描述】:

我正在使用 Xcode 6(GM,我没有下载测试版),并且正在为 iOS 7+ 开发应用程序。对于我所有的项目,我只是打开了以前在 Xcode 5 中工作的相同项目。

在断点导航器中,我打开了All Exceptions 断点。它设置为Break: On Throw。现在,每次我运行我的应用程序(无论是在设备上还是在模拟器中),它都会在 main() 函数中的 return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 行上停止执行。

如果我按 Play 继续执行程序两次,程序运行良好。所以这并不妨碍我工作,但是每次都必须手动播放执行并重置我的编辑器很烦人。

我喜欢我在 Xcode 中设置的行为(将当前编辑器带到执行暂停的位置),并且拥有 All Exceptions 断点在 IMO 中很重要。 (所以我不想改变这些)

通过在相同的环境中为 iOS 7 目标(同样是设备或模拟器)运行相同的代码,不会引发异常。

有什么可能导致这种奇怪行为的线索吗?

【问题讨论】:

  • 我在XCode 6.0.1 中发现了同样的行为,但我不知道背后的原因!也许它是某种错误!
  • 如果从 All Exceptions 更改为 Objective-C Exceptions,问题会消失吗?
  • 是的!我在模拟器中测试过一次,在设备上测试过一次。知道为什么吗?请写下这个作为答案。

标签: objective-c xcode ios8 xcode6


【解决方案1】:

如 cmets 中所述,您应该通过编辑 All Exceptions 断点来关闭捕获 C++ 异常。

为此,请右键单击断点并将 ExceptionAll 更改为 Objective-C

C++ 代码中的异常是正常应用功能的一部分。但是,异常断点不是捕获未处理的而是捕获每个引发的异常,即使它们稍后被正确处理,因此会停止执行。

【讨论】:

    【解决方案2】:

    TLDR;就我而言,问题的原因是缺少字体。

    我也有这个问题。虽然@Johnnywho 是正确的,只为Objective-C 留下异常断点,停止了不需要的行为,但它仍然没有解释真正的原因是什么,为什么它在iOS7 上无异常运行以及为什么这只发生在某些项目上。

    这就是为什么我继续并剖析了我遇到此问题的一个项目,直到我能够找到原因为止。我想这种行为可能有不止一个原因,但在我的情况下,这是缺少自定义字体。

    快速测试方法:

    1. 开始一个新的单视图项目

    2. 对所有异常启用断点,包括 C++(Breakpoints / + / 添加异常断点)

    3. 将一些自定义字体拖到项目中(允许复制并检查要添加的目标)

    4. 在主视图控制器中为视图添加标签

    5. 为您的标签选择自定义字体(在 Xcode 6+ 上,它应该在您将其拖入项目后立即显示在字体选择器中)。

    6. 运行应用程序并确认您在自定义字体中看到了标签(似乎我们不再需要在 Info.plist 中为“应用程序提供的字体”键添加字体文件名了,如果自定义字体已在应用程序的 xib 情节提要中使用)。

    7. 现在从您的项目中删除自定义字体(通过取消选中目标关系或通过在目标设置/构建阶段/复制捆绑资源中删除它)

    8. 从您的设备或 SIM 卡中删除应用程序(从应用程序包中删除字体文件)

    9. 产品/清洁

    10. 再次运行应用程序(现在标签仍然包含对自定义字体的引用,但应用程序没有它的文件)。如果你在 iOS8 上运行,你应该会注意到这个神秘的异常。

    11. 在装有 iOS7 的设备或装有 iOS7 的 sim 卡上运行应用程序(为此,您需要将 iOS 部署目标更改为 iOS7)。虽然标签不会显示自定义字体,但不会有异常。

    12. 将字体文件添加回目标,并且断点不再在运行时停止。

    所以我的结论是,在 iOS8 上缺少字体会导致 C++ 异常,而在 iOS7 上却不会,因此会触发断点。

    类似的异常(和断点触发)也可能是由 Info.plist 文件中“应用程序提供的字体”键下的字体文件名错误写入引起的。

    【讨论】:

    • 谢谢,我厌倦了听到人们说通过切换到objective-c来忽略它。我想修复错误而不是掩盖它,这让我看到了一个我应该注意的问题并解决了我的问题,谢谢。我有胆量对所有说仅将其切换为objective-c的答案投反对票。
    • 没错,如果时间允许,我也更喜欢挖掘原因而不是处理症状。
    • 谢谢!就我而言,当我将字体添加到我的 info.plist 时,我忘记了文件扩展名。所以以防万一它会帮助其他人,我想我会在这里提到它。 (这里也是我找到截图的链接,它提示我需要包含文件扩展名的完整文件名。codewithchris.com/…
    • 谢谢! +1 实际解决这个问题。
    【解决方案3】:

    刚刚总结了以前帮助我解决它的答案。

    问题:当您添加自定义字体然后显然删除(替换)它时,项目中的某处仍然是他的引用,并且断点在 iOS 8 中的主 C++ lib 断点处停止了几次。

    解决方案

    1) 在项目中查找并删除(替换)对这些字体的所有引用。可能在一些笔尖、子模块等中......

    2) 如果你不能到处修复(例如,只读库使用它们)或解决方案 1 后问题仍然存在,请将这些旧字体添加回项目

    3) 忽略它 - 它是 C++ 库,因此仅将断点异常从“All”更改为“Objective-C”

    【讨论】:

      【解决方案4】:

      Xcode 9,有时会抛出异常,但 iOS 会优雅地捕捉它。这会有所帮助

      source

      就我而言,它是 nib 中的用户定义属性

      【讨论】:

      • 真是个好技巧!感谢分享!调试会话中是否有任何提示您在 po'ing $arg1?假设变量不是零,你会尝试po $arg2吗?
      【解决方案5】:

      我有同样的问题,问题是我从其他项目中添加了一些界面文件,其中有不同的字体。只需找到它们并删除即可。

      【讨论】:

        猜你喜欢
        • 2013-06-18
        • 2014-01-07
        • 2011-03-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多