一千萬個為什麽

搜索

Objective-c靜態實例

我想創建基於數據庫的模型,所以我想用我自己的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有一個設計模式叫做辛格爾頓,這將在這裏很好地工作。您創建一個類的單個實例,然後有一個返回該實例的方法(通常沿著+ sharedClassName的行)。

對於更多的閱讀,CocoaDev提供了一些有關單身設計模式和Cocoa with愛有一篇關於單身人士,AppDelegates和頂級數據的好文章

轉載註明原文: Objective-c靜態實例