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中的一个要求。