我在 Swift 项目中使用 Typhoon Framework 版本 2.3.0 时遇到了非常烦人的问题。
我在 Podfile 中包含 Typhoon,如教程中所述,安装 Pod,创建桥接头并添加 #import <Typhoon/Typhoon.h>
在这个标题中。
然后我创建了名为 ApplicationAssebly 的程序集子类:
import Foundation
public class ApplicationAssembly: TyphoonAssembly {
public dynamic func appDelegate() -> AnyObject {
return TyphoonDefinition.withClass(AppDelegate.self) {
(definition) in
definition.injectProperty("myAssembly", with: self)
}
}
}
如您所见,我想将该程序集注入(inject) AppDelegate。 我还在 Info.plist 文件中添加了 TyphoonInitialAssemblies 条目。而在这一刻,我的问题开始了。我测试了几种导致 NSException 的组合:
Can't resolve assembly for name xxx
这些组合是(typhtest 是项目/包名称):
- Info.plist 中的类名:ApplicationAssembly,在build设置中定义模块属性:否
- Info.plist 中的类名:ApplicationAssembly,在build设置中定义模块属性:是
- Info.plist 中的类名:typhtest.ApplicationAssembly,在build设置中定义模块属性:否/li>
- Info.plist 中的类名:typhtest.ApplicationAssembly,在build设置中定义模块属性:是/li>
我找到了 this在 StackOverflow 上回答,所以我尝试了最后一个组合:
- Info.plist 中的类名:_TtC8typhtest19ApplicationAssembly,在build设置中定义模块属性:是
此组合不会抛出 NSException,但我有 dyld_fatal_error,下面是来自 iPhone 5s (iOS 7.1) 的堆栈跟踪:
我从 iPhone 模拟器 (iOS 7.1) 得到的堆栈跟踪略有不同:
它在 iOS 8.1 模拟器上运行有什么奇怪的!还有 Typhoon Sample Application for Swift在我的设备上运行良好。
我还尝试清理所有 Xcode 和项目缓存以及 DerivedData 目录,我清理了项目和构建文件夹并重建了项目,但它不起作用。我的 Xcode 版本是 6.1 (6A1052d),我使用的是 OSX Yosemite 10.10.1。
带有我的代码的 GitHub 存储库:https://github.com/papcio28/Typhoon-Dyld-Error
2014 年 11 月 21 日编辑
同样奇怪的是,如果我手动创建工厂并手动注入(inject)一些东西,Typhoon 会起作用。我所做的步骤是:
- 已删除
TyphoonInitialAssemblies
来自 Info.plist 的项目 更改
AppDelegate.application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool
到func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { let factory = TyphoonBlockComponentFactory(assemblies: [AppAssembly()]) factory.inject(self) return true }
但这并没有改变我想在不手动定义工厂的情况下使用 Typhoon 的事实,所以问题仍然是实际的。
最佳答案
该问题已被复现as a bug并将尽快解决。在 pod update
之后,它也在 Typhoon 示例应用程序中重现,同时干净的结帐工作正常。这表明在 2.2.1 和 2.3.0 之间的某个地方出现了回归错误,但是检查它会产生一些奇怪的结果,因此实际情况可能并非如此。我们会将更新/发现发布到问题日志中。
解决方法:
与此同时,请通过在您的 AppDelegate 中覆盖以下方法来引导 Typhoon:
dynamic func initialFactory() -> TyphoonComponentFactory {
return TyphoonBlockComponentFactory(assemblies:[
ApplicationAssembly(),
AnotherAssemblyIfRequired()])
}
这种方法像 plist 集成一样引导 Typhoon,因此提供 UIStoryboard 集成、UIStateRestoration 等。 .它直到现在才被记录下来,因为我们认为 staring Typhoon 的 plist 风格已经足够了,提供太多选项只会让人感到困惑。然而,在这种情况下,它适用于 iOS7.1+Swift+Storyboards 而 plist 不适用。
命名空间:
至于命名空间问题,应该没有必要像您那样在 plist 文件中破坏名称 - Typhoon 将检测隐式命名空间是否可用并透明地处理它。但是,如果目前这在 iOS7.x 中不起作用,您可以按如下方式向程序集添加指令:
@objc(ApplicationAssembly)
public class ApplicationAssembly : TyphoonAssembly {
//etc
}
编辑:在 Typhoon 2.3.1 中修复:
从 Typhoon 2.3.1 开始,plist bootstrapping 现在可以与 Swift+iOS7.x 一起使用
关于ios - dyld_fatal_error 与 Typhoon+Swift+iOS7.x+Plist-bootstrapping,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27035279/