我想创建基于数据库的模型,所以我想使用我自己的DatabaseModel类来管理数据库连接,并且每个使用数据库的类都派生自它(它将是模型和表之间的映射) 。我正在使用 sqlite API。
由于我只需要一个数据库连接实例,因此我创建了一个静态变量来存储连接实例
DatabaseModel.h --------------- @interface DatabaseModel : NSObject { } // the connection instance static FMDatabase *database; +(BOOL) open; +(void) close; +(id)getDatabase; @end DatabaseModel.m --------------- // Is it necassary? static FMDatabase *database = nil; @implementation DatabaseModel +(BOOL) open { // make connection (doodled code) database = [DBAPI open]; } +(void) close { // ... } +(id)getDatabase { // Throws bad_memory_access [database retain]; return database; } @end MyClass.h --------- @interface MyClass : DatabaseModel { } -(void) foobar; @end MyClass.m --------- @implementation MyClass -(void) foobar { // This assign doesn't work database = [DatabaseModel getDatabase]; } @end
在这种情况下,[数据库保留]会引发 bad_access 异常。我完全不明白,当数据库是静态变量时,为什么我收到此消息......
最佳答案
- 看起来不是您创建的 任何地方的对象。你需要分配 并在你可以之前初始化该对象 使用它。
- 您不应该在每次有人调用 +getDatabase 时都保留静态对象。这将导致对象被过度保留,并且实际上没有任何理由,一旦您分配并初始化它,那么静态变量将拥有它,并且您不再需要任何保留。
Cocoa 有一个设计模式调用 Singleton这在这里会很好用。您创建一个类的单个实例,然后使用一个返回该实例的方法(通常类似于 +sharedClassName)。
要阅读更多内容,CocoaDev 上有一些关于 singleton design pattern 的好信息。 Cocoa with Love 在 Singletons, AppDelegates and top-level data 上有一篇很好的文章.
关于Objective-c 静态实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/961769/