2

我正在使用 Typhoon 框架来集成我所有的核心组件。我正在处理我的数据层(使用 FMDB 而不是 Core Data)。我有一个 LocalDataStore 类来处理数据到 SQLite 的读取和写入。这是一个单例类,具有设置数据库的初始化方法。然后我有一个引用它的 PlayerDAO。

当我启动应用程序时,会创建 LocalDataStore 并调用初始化方法。然后它开始创建 DAO 类,当它尝试访问 LocalDataStore 时,我收到一个 EXC_BAD_ACCESS 错误。

在启动方案中打开“启用僵尸对象”,我得到一个额外的错误: -[myapp.SQLiteLocalStore retain]: message sent to deallocated instance 0x1740ab5e0

以下是我在 Typhoon Assembly 中的设置方式:

dynamic func config() -> TyphoonDefinition {
    return TyphoonDefinition.configDefinitionWithName("MyApp.plist")
}

dynamic func localStore() -> AnyObject {
    return TyphoonDefinition.withClass(SQLiteLocalStore.self, configuration: {
        (definition) in

        definition.injectProperty("databaseName", with: TyphoonConfig("sqlite.filename"))

        definition.performAfterInjections("initDatabase")
        definition.scope = .Singleton
    })
}

dynamic func playerDAO() -> AnyObject {     
    return TyphoonDefinition.withClass(SQLitePlayerDAO.self, configuration: {
        (definition) in

        definition.injectProperty("localStore", with: self.localStore())
    })
}

查看错误发生时的断点,它发生在TyphoonComponentFactory中的这一行:

- (id)newOrScopeCachedInstanceForDefinition:(TyphoonDefinition *)definition args:(TyphoonRuntimeArguments *)args {
   ...
   instance = [pool objectForKey:poolKey];   // line 431
   ...
}

poolKey = @"localStore"

调试器说它当前正在初始化 playerDAO。该池只有 1 个“localStore”键,值为 _NSZombie_myApp.SQLiteLocalStore

知道可能出了什么问题吗?

4

1 回答 1

2

好吧,改变它definition.scope = .Singletondefinition.scope = .LazySingleton修复它......在我的情况下,无论如何可能是一个更好的方法。

我仍然很好奇我是否做错了什么导致普通 Singleton 出现内存错误。

于 2015-07-07T00:49:03.977 回答