iOS中静态库中的单例

iOS中静态库中的单例,ios,objective-c,Ios,Objective C,我有一个静态库,其中包含一个单例类(FMDB SQLite Data Access),现在我从我的主应用程序打开连接并做一些事情。。。这是可行的,在我的库中的一个方法想要在我的单例上调用a方法之后,我得到了 -[FMDatabase executeQuery:withArgumentsInArray:]: message sent to deallocated instance 0xa443960 这不可能是我想要实现的吗 这是我的单身汉的简短版本 static MySingleton

我有一个静态库,其中包含一个单例类(FMDB SQLite Data Access),现在我从我的主应用程序打开连接并做一些事情。。。这是可行的,在我的库中的一个方法想要在我的单例上调用a方法之后,我得到了

-[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在我的应用程序开始返回后被调用,但不知道为什么

编辑2:

目前我认为一个问题是这条线

数据库=[FMDatabase databaseWithPath:[self-getDocumentResourcePath]];
这里我必须保留对象。

您实际上没有分配singleton实例:

if (!_sharedMySingleton)
    [[self alloc] init];
应该是:

if (!_sharedMySingleton)
     _sharedMySingleton = [[self alloc] init];
并转储覆盖的
alloc
方法


另外,
数据库
应该是类中的一个实例变量,而不是全局范围。

如果单例“管理”数据库,那么从逻辑上讲,这意味着过早释放的是数据库。很遗憾,只有在我从库端调用单例时才会发生。。。我找不到为什么数据库会被释放如果你在singleton中有一个很强的引用,那么它就不应该被释放。运行zombies instrument查看到底发生了什么。我添加了一些代码,启用了zombies Hanks,我编辑了它,但奇怪的是,它在没有赋值的情况下也能工作,为什么?因为重写了
alloc
方法。这是非常不传统的,我会避免使用它。