ios - dyld_fatal_error 与 Typhoon+Swift+iOS7.x+Plist-bootstrapping

标签 ios xcode swift dyld typhoon

我在 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 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 日编辑

同样奇怪的是,如果我手动创建工厂并手动注入(inject)一些东西,Typhoon 会起作用。我所做的步骤是:

  1. 已删除 TyphoonInitialAssemblies来自 Info.plist 的项目
  2. 更改 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/

相关文章:

iphone - iOS iPhone MVC 基础知识

ios - 如何 NSLog 进入文件

ios - NSAttributedString 背景色渲染 iOS 10 VS iOS 11

swift - 播放一个声音循环,同时至少有一个同类 Sprite 在舞台上

xcode - cocoa - 应用程序架构

swift - 我如何随机化一个负面的位置?

ios - 如何调整与其 super View 成比例的标签

iOS:始终在后台运行单例实例(不同线程)

ios - 如何将 CLLocationManager.magneticHeading 转换为弧度?

ios - 在 Swift 中将参数传递给 NSTimer 调用的方法