微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我在 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的组合:

Can’t resolve assembly for name xxx

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

> Info.plist中的ClassName:ApplicationAssembly,在Build Settings中定义Module属性:No
> Info.plist中的ClassName:ApplicationAssembly,在Build Settings中定义Module属性:Yes
> Info.plist中的ClassName:typhtest.ApplicationAssembly,在Build Settings中定义Module属性:No
> Info.plist中的ClassName:typhtest.ApplicationAssembly,在Build Settings中定义Module属性:Yes

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

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

这个组合不会抛出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日编辑

同样奇怪的是,如果我手动创建工厂并手动注入某些东西,typhoon也可以.我做的步骤是:

>从Info.plist中删除typhoonInitialAssemblies项
>更改AppDelegate.application(应用程序:UIApplication,didFinishLaunchingWithOptions launchOptions:[NSObject:AnyObject]?) – >布尔来

func application(application: UIApplication,didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    let factory = typhoonBlockComponentFactory(assemblies: [AppAssembly()])
    factory.inject(self)
    return true
}

但它没有改变我想在没有手动定义工厂的情况下使用typhoon这一事实,所以问题仍然存在.

此问题已转载 as a bug并将尽快解决.在pod更新后,它也被复制在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 Storyboard,而plist则不适用.

命名空间:

至于命名空间问题,没有必要像你一样破坏plist文件中的名称typhoon将检测隐式命名空间是否可用并透明地处理它.但是,如果这在iOS7.x中当前不起作用,您可以按如下方式向程序集添加指令:

@objc(ApplicationAssembly)
public class ApplicationAssembly : typhoonAssembly {
    //etc
}

编辑:在台风2.3.1中修复:

typhoon 2.3.1开始,plist bootstrapping现在可以与Swift iOS7.x一起使用

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐