Xcode在iOS 8的Main()中抛出一个异常,带有'all exceptions'断点

inv*_*ent 52 xcode objective-c xcode6 ios8

我正在使用Xcode 6(通用汽车,我没有下载测试版),我正在为iOS 7+开发应用程序.对于我的所有项目,我只是打开了我曾经在Xcode 5中工作的相同项目.

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

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

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

通过使用相同的环境运行相同的代码,对于iOS 7目标(再次,设备或模拟器),不会抛出异常.

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

Joh*_*who 100

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

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

将All改为Objective-C

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


And*_*tis 31

TLDR; 在我的情况下,问题的原因是缺少字体.

我也有这个问题.虽然@Johnnywho只为Objective-C留下Exception Breakpoint是正确的,但是停止了不需要的行为,它仍然没有解释什么是真正的原因,为什么它在iOS7上毫无例外地运行,为什么这只发生在某些项目上.

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

快速测试方法:

  1. 启动一个新的单一视图项目

  2. 在所有异常上启用断点,包括C++(Breakpoints/+/Add Exception Breakpoint)

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

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

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

  6. 运行应用程序并确认您在自定义字体中看到标签(似乎我们不需要在Info.plist中为键"应用程序提供的字体"添加字体文件名称,如果自定义字体已经用于应用程序的xib的故事板).

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

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

  9. 产品/清洁

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

  11. 使用iOS7运行应用程序或使用iOS7运行应用程序(您需要将iOS部署目标更改为iOS7).虽然标签不会显示自定义字体,但不会有例外.

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

所以我的结论是,在iOS8上,丢失的字体会导致C++异常,而在iOS7上却没有,因此断点触发器.

类似的异常(和断点触发器)也可能是由Info.plist文件中的错误编写的字体文件名引起的,该键是"应用程序提供的字体".

  • 谢谢你,我已经厌倦了听到人们说通过切换到objective-c来忽略它.我想修复错误而不是掩盖它,这让我的眼睛看到了一个问题,我应该注意并修复我的问题谢谢.我有一半的勇气向下投票所有答案,只能将其切换为objective-c. (2认同)