加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-14 02:24:57 所属栏目:百科 来源:网络整理
导读:我在 Swift项目中使用Typhoon Framework 2.3.0版本时遇到了非常烦人的问题. 我在教程中提到了Podfile中的Typhoon,安装了Pods,创建了桥接头并添加了#import Typhoon / Typhoon.h在这个标题中. 然后我创建了名为ApplicationAssebly的汇编子类: import Foundat
我在 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一起使用

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读