2013-03-05 65 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