Objective-c 静态实例

标签 objective-c static

我想创建基于数据库的模型,所以我想使用我自己的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 异常。我完全不明白,当数据库是静态变量时,为什么我收到此消息......

最佳答案

  1. 看起来不是您创建的 任何地方的对象。你需要分配 并在你可以之前初始化该对象 使用它。
  2. 您不应该在每次有人调用 +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/

相关文章:

ios - 禁用 App Transport Security 和潜在的下层客户端中断

ios - iOS 8 中未调用 CLLocationmanager updateLocations 委托(delegate)方法

c# - 在 ASP.Net Web 应用程序数据层中实现静态方法是否安全?

Java代码错误链表

iphone - 无法识别触摸导航栏的 ImageView 。?

ios - 根据预期的字符创建字符串

ios/iphone sdk 表单管理最佳实践

c++ - 跨系统静态成员初始化

java - 使用泛型类型调用静态方法

django - Windows 上 Django 1.5 静态文件的正确配置是什么?