Obj-C / Swift项目中的致命陷阱exception
我开始将Swift代码集成到我的Obj-C项目中。 一切都很顺利,但今天,当我更新到Xcode 6.1,事情打击粉丝。 我从以前运行良好的Swift代码中收到了一些“陷阱”exception。
第一次崩溃是在我的UIFont的扩展。 这是我的代码:
class func specialFont() -> UIFont { let font = UIFont(name: "FontName", size: 12.0) return font! }
在更新到Xcode 6.1之前,此代码工作正常,但现在在dylddyld_fatal_error: 0x1fe1608c: trap
使用EXC_BREAKPOINT (code=EXC_ARM_BREAKPOINT)
崩溃。 (顺便说一句,我没有设置exception断点)。试图继续执行程序不会生成一个崩溃日志,它只是进入一个无尽的循环产生的exception。 在Xcode 6.1更新之前,代码再次正常工作。
第二次崩溃是特别奇怪的,因为它只发生在设备上而不是模拟器上。 与上面相同的例外信息。 这里是第二个崩溃的代码:
let tap = UITapGestureRecognizer(target: self, action: "didTap") self.addGestureRecognizer(tap)
谢谢你的帮助!
UPDATE
堆栈跟踪如下:
0] dyld_fatal_error 1] dyld_stub_binder 4] Project.FileWhereCrashTriggers.methodTriggeringCrash 5] @objc Project.FileWhereCrashTriggers.methodTriggeringCrash 6] -- continued trace up to call of method crashing
关于这些崩溃的一个奇怪的事情是,他们不会在实际的代码行上触发exception,正如您从堆栈跟踪中看到的那样。 他们在dyld_fatal_error中断。
我无法上传任何控制台输出,因为应用程序在Xcode中运行时从未崩溃 – 它调用的方式与EXC_BAD_ACCESS类似。 我以非debugging模式触发崩溃,然后使用Organizer查看设备日志,这是它提供的:
exceptiontypes:EXC_BREAKPOINT(SIGTRAP)exception代码:0x0000000000000001,0x00000000e7ffdefe由线程触发:0
Dyld错误消息:未find符号:__TFSSCfMSSFT21_builtinStringLiteralBp8byteSizeBw7isASCIIBi1__SS引用自:/private/var/mobile/Containers/Bundle/Application/4ABA71F8-A6D1-4E4B-A452-DE339065310A/Project.app/Project
预计位于:/private/var/mobile/Containers/Bundle/Application/4ABA71F8-A6D1-4E4B-A452-DE339065310A/Project.app/Frameworks/libswiftCore.dylib Dyld Version:353.5
一个干净的构build解决了我(从XCode清除和删除设备上的应用程序)
经过更多的实验后,我可以通过在swift文件中使用@objc
标记来解决这些冲突,这些swift文件可以被我的Obj-C代码调用, 包括init方法 。 例如,将override init(frame: CGRect)
更改为@objc override init(frame: CGRect)
。
@objc
:为什么在Xcode 6.0中为什么@objc
标志不是'必需的'(尽pipe这可能是最好的做法),但突然间是Xcode 6.1中的一个要求。