EXC_BAD_ACCESS 到台风单身人士参考
EXC_BAD_ACCESS to Typhoon Singleton Reference
我正在使用 Typhoon Framework 来集成我所有的核心组件。我正在处理我的数据层(使用 FMDB 而不是 Core Data)。我有一个 LocalDataStore class 来处理 SQLite 的数据读写。这是一个具有设置数据库的初始化方法的单例 class。然后我有一个引用它的 PlayerDAO。
当我启动应用程序时,会创建 LocalDataStore 并调用初始化方法。然后它会创建 DAO class,当它尝试访问 LocalDataStore 时,我收到 EXC_BAD_ACCESS 错误。
在启动方案中打开 "Enable Zombie Objects",我收到一个额外的错误:
-[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。该池只有 "localStore" 的 1 个键,值为 _NSZombie_myApp.SQLiteLocalStore
知道哪里出了问题吗?
好吧,将 definition.scope = .Singleton
更改为 definition.scope = .LazySingleton
修复了它...就我而言,这可能是一个更好的方法。
我仍然很好奇我是否做错了什么导致普通单例内存错误。
我正在使用 Typhoon Framework 来集成我所有的核心组件。我正在处理我的数据层(使用 FMDB 而不是 Core Data)。我有一个 LocalDataStore class 来处理 SQLite 的数据读写。这是一个具有设置数据库的初始化方法的单例 class。然后我有一个引用它的 PlayerDAO。
当我启动应用程序时,会创建 LocalDataStore 并调用初始化方法。然后它会创建 DAO class,当它尝试访问 LocalDataStore 时,我收到 EXC_BAD_ACCESS 错误。
在启动方案中打开 "Enable Zombie Objects",我收到一个额外的错误:
-[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。该池只有 "localStore" 的 1 个键,值为 _NSZombie_myApp.SQLiteLocalStore
知道哪里出了问题吗?
好吧,将 definition.scope = .Singleton
更改为 definition.scope = .LazySingleton
修复了它...就我而言,这可能是一个更好的方法。
我仍然很好奇我是否做错了什么导致普通单例内存错误。