2013-03-05 70 views
2

我有一個靜態庫,其中包含一個Singleton類(FMDB SQLite數據訪問),現在我從我的主應用程序中打開連接並執行thingss ...這工作,之後,我的方法圖書館要調用的方法對我單身,我得到了錯誤在iOS中的靜態庫中的單身人士

-[FMDatabase executeQuery:withArgumentsInArray:]: message sent to deallocated instance 0xa443960 

這是不可能的我想要達到什麼目的?

這是我單身的短版

static MySingleton* _sharedMySingleton = nil; 

    FMDatabase *database; 

    #ifndef __clang_analyzer__ 
    +(MySingleton*)sharedMySingleton 
    { 
    @synchronized([MySingleton class]) 
    { 
     if (!_sharedMySingleton) 
      [[self alloc] init]; 

     return _sharedMySingleton; 
    } 
     } 
     #endif 

    +(id)alloc 
    { 
    @synchronized([MySingleton class]) 
    { 
     NSAssert(_sharedMySingleton == nil, @"Attempted to allocate a second instance of a singleton."); 
     _sharedMySingleton = [super alloc]; 
     return _sharedMySingleton; 
    } 
    } 

    -(Resource *)getResourceForName:(NSString *)name 
    {  
    NSString *select = @"SELECT Data, MimeType FROM File WHERE FileName = ? LIMIT 1"; 

    NSArray *arguments = [NSArray arrayWithObject:[NSString stringWithFormat:@"/%@", name]]; 

    FMResultSet *s = [database executeQuery:select withArgumentsInArray:arguments]; 

    if (s == NULL) 
    { 
     FuncFileLog(@"getResourceForName file cant be loaded: %@", [database lastErrorMessage]); 
     return nil; 
    } 
    NSData *data = nil; 
    NSString *mimeType; 

    while ([s next]) 
    { 
     data = [NSData dataFromBase64String:[s stringForColumnIndex:0]]; 
     mimeType = [s stringForColumnIndex:1]; 
    } 

    Resource *resource = [[[Resource alloc] initWithData:data mimeType:mimeType] autorelease]; 

    return resource; 
    } 

    -(BOOL)openDatabase 
    { 
    database = [FMDatabase databaseWithPath:[self getDocumentResourcePath]]; 
    return [database open]; 
    } 

    -(void)closeDatabase 
    { 
     [database close]; 
     [database release]; 
    } 

    -(void)dealloc 
    { 
    if (database != NULL) 
    { 
     [self closeDatabase]; 
    } 
    [baseUrl release]; 
    [super dealloc]; 
    } 

    @end 

編輯:

我發現,從FMDatabase的的dealloc得到我的應用程序開始返回後調用,但不知道爲什麼。

EDIT2:

目前我認爲一個問題是此行

數據庫= [FMDatabase databaseWithPath:[自getDocumentResourcePath]]; 這裏我必須保留這個對象。

+1

如果單身人士「管理」數據庫,那麼這意味着在邏輯上它是*數據庫*被過早釋放。 – CodaFi 2013-03-05 14:33:40

+0

只有當我從庫側調用單例時纔會發生......我無法找到數據庫爲什麼被釋放的原因 – Sebastian 2013-03-05 14:35:22

+0

如果你在單例中有強烈的引用,那麼它不應該被釋放。運行殭屍工具,看看發生了什麼。 – CodaFi 2013-03-05 14:39:16

回答

1

其實你不分配單個實例:

if (!_sharedMySingleton) 
    [[self alloc] init]; 

應該是:

if (!_sharedMySingleton) 
    _sharedMySingleton = [[self alloc] init]; 

和轉儲覆蓋alloc方法。

另外database應該是類中的一個實例變量,而不是全局作用域。

+0

謝謝我編輯它,但奇怪的是它沒有任務也工作,爲什麼? – Sebastian 2013-03-05 14:54:00

+0

由於重寫了'alloc'方法。這非常非常規,我會避免使用它。 – trojanfoe 2013-03-05 14:54:50

+0

謝謝你的解釋,單身人士不是我自己的代碼,所以... – Sebastian 2013-03-05 14:56:10