使用Typhoon + Swift + iOS7.x + Plist-bootstrapping的dyld_fatal_error

时间:2014-11-20 08:51:06

标签: ios xcode swift dyld typhoon

我在Swift项目中使用Typhoon Framework 2.3.0版本时遇到了非常烦人的问题。

我在教程中提到了Podfile中的Typhoon,安装了Pods,创建了桥接标题并在此标题中添加了#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)
        }
    }
}

如您所见,我想将该程序集注入AppDelegate。 我还在Info.plist文件中添加了TyphoonInitialAssemblies条目。在这一刻,我的问题已经开始。我测试了几个导致NSException的组合:

  

无法解析名称xxx

的程序集

这种组合是( typhtest 是项目/包名称):

  • Info.plist中的ClassName: ApplicationAssembly ,在构建设置中定义模块属性:
  • Info.plist中的ClassName: ApplicationAssembly ,在构建设置中定义模块属性:
  • Info.plist中的ClassName: typhtest.ApplicationAssembly ,在构建设置中定义模块属性: < / LI>
  • Info.plist中的ClassName: typhtest.ApplicationAssembly ,在构建设置中定义模块属性: < / LI>

我在StackOverflow上找到了this答案,所以我尝试了最后一个组合:

  • Info.plist中的ClassName: _TtC8typhtest19ApplicationAssembly ,在构建设置中定义模块属性:

这个组合不会抛出NSException,但我有 dyld_fatal_error ,来自iPhone 5s(iOS 7.1)的堆栈跟踪:

iPhone 5s - iOS 7.1 error stack trace

我从iPhone模拟器(iOS 7.1)获得略有不同的堆栈跟踪:

iOS 7.1 emulator error stack trace

有什么奇怪的,它适用于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日

同样奇怪的是,如果我手动创建工厂并手动注入某些东西,Typhoon也会工作。我所做的步骤是:

  1. 从Info.plist
  2. 中删除了TyphoonInitialAssemblies
  3. 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
    }
    
  4. 但它没有改变我想在没有手动定义工厂的情况下使用Typhoon的事实,所以这个问题仍然存在。

1 个答案:

答案 0 :(得分:4)

此问题已转载as a bug,并将尽快解决。在pod update之后,它也被复制在Typhoon示例应用程序中,同时一个干净的结帐工作正常。这表明回归错误已经在2.2.1和2.3.0之间徘徊,但是检查这会导致一些奇怪的结果,所以实际情况可能并非如此。我们会将更新/发现发布到问题日志中。

解决方法:

在此期间,请通过覆盖AppDelegate中的以下方法来引导Typhoon:

dynamic func initialFactory() -> TyphoonComponentFactory {

    return TyphoonBlockComponentFactory(assemblies:[
        ApplicationAssembly(),
        AnotherAssemblyIfRequired()])
}

这种方法就像plist-integration一样引导Typhoon,因此提供了UIStoryboard集成,UIStateRestoration等等。 。直到现在还没有记录,因为我们认为盯着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一起使用