Xcode在iOS 8中的Main()中引发exception,并带有“所有exception”断点
我正在使用Xcode 6(GM,我没有下载beta),我正在开发适用于iOS 7+的应用程序。 对于我所有的项目,我只是打开了我以前在Xcode 5中使用过的项目。
在断点导航器中,我有All Exceptions
断点。 它被设置为Break: On Throw
。 现在,每次我运行我的应用程序(无论是在设备上还是在模拟器中),它都会停止执行, return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
在main()
函数中。
如果按Play继续执行两次程序,程序运行正常。 所以这并不妨碍我的工作,但是每次都要手动执行执行程序并重置我的编辑器是很烦人的。
我喜欢我在Xcode中设置的行为(将当前编辑器放在执行暂停的位置),并且让All Exceptions
断点是重要的IMO。 (所以我不想改变这些)
通过运行相同的代码,在相同的环境下,对于iOS 7目标(同样是设备或模拟器),不会抛出exception。
任何线索可能会导致这种奇怪的行为?
如注释中所述,您应该通过编辑“ 所有exception”断点来closures捕获C ++exception。
为了做到这一点,请右键单击断点,将Exception从All更改为Objective-C :
C ++代码中的例外是普通应用程序function的一部分。 但是,exception断点并不捕捉未处理的内容,而是每次引发的exception,即使在稍后处理正确时也是如此,因此停止执行。
TLDR; 在我的情况下,问题的原因是缺less字体。
我也有这个问题。 虽然@Johnnywho是正确的,只留下Objective-C的exception断点,停止不需要的行为,它仍然不能解释什么是真正的原因,为什么它在iOS7上运行,没有例外,为什么这只发生在一些项目。
这就是为什么我继续解剖我的问题之一,直到我find原因。 我想这可能有多个原因,但在我的情况下,缺less自定义字体。
快速testing方法:
-
开始一个新的单一视图项目
-
对所有exception启用断点,包括C ++(断点/ + /添加exception断点)
-
拖入项目的一些自定义字体(允许复制和检查目标添加到)
-
在主视图控制器的视图中添加一个标签
-
为您的标签select自定义字体(在Xcode 6+上,只要将它拖到项目中,它就会显示在字体select器中)。
-
运行应用程序,并确认您看到自定义字体中的标签(似乎我们不需要在Info.plist中为“应用程序提供的字体”键添加字体文件名,如果自定义字体已经用在应用程序的xib的故事板中)。
-
现在从您的项目中删除自定义字体(通过取消目标关系或通过在目标设置/构build阶段/复制包资源中删除它)
-
从设备或SIM上删除应用程序(从应用程序包中删除字体文件)
-
产品/清洁
-
再次运行应用程序(现在标签仍然有对自定义字体的引用,但应用程序没有该文件)。 如果您在iOS8上运行,您应该注意到这个神秘的exception。
-
在iOS7设备上运行应用程序,或者在iOS7上运行SIM卡(为此,您需要将iOS部署目标更改为iOS7)。 虽然标签不会显示自定义字体,但不会有例外。
-
将字体文件添加回目标,断点不会停止运行。
所以我的结论是,在iOS8上,丢失的字体会导致C ++exception,而在iOS7中则不会,因此会触发断点。
类似的exception(和断点触发器)也可能由Info.plist文件中错误地写入“应用程序提供的字体”下的字体文件名造成的。
只是总结了以前的答案,帮助我解决这个问题。
问题:当您添加自定义字体,然后显然删除(replace)它,项目中的某个地方仍然是他的参考和断点在iOS 8的主C ++ lib断点停止几次停止。
解决scheme
1)在项目中查找并删除(replace)所有对这些字体的引用。 可能在一些笔尖,子模块等…
2)如果你不能在任何地方修复(只读的库使用它们),或者在解决scheme1之后问题仍然存在,那么将这些旧的字体添加回项目
3)忽略它 – 它是C ++ lib,所以只能将断点exception从“All”改为“Objective-C”