ios - iOS静态库中的单例

标签 ios objective-c

我有一个静态库,其中包含一个 Singleton 类(FMDB SQLite 数据访问),现在我从我的主应用程序打开连接并做一些事情......这有效,之后我的库中的一个方法想要调用 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:

目前我认为一个问题是这一行

database = [FMDatabase databaseWithPath:[self getDocumentResourcePath]]; 这里我必须保留对象。

最佳答案

您实际上并没有分配单例实例:

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

应该是:

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

并转储覆盖的 alloc 方法。

此外,database 应该是类中的实例变量,而不是在全局范围内。

关于ios - iOS静态库中的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15226269/

相关文章:

ios - 如何使用 AutoLayout 将 UIButtons 定位在水平线上(环绕,左对齐)?

iphone - NSMutableArray 崩溃应用程序

objective-c - Swizzling 单个实例,而不是类

iphone - 如何使用代码更改显示名称

ios - 在 Objective-C 中查找数组中的元素子数组的最有效方法是什么?

iphone - 在 Objective-C 中绑定(bind)指针

ios - 在 Alamofire 中上传包含多部分表单数据的多张图片时出错

ios - 导航 Controller 背景图像使用 xcode 9 在 ios 11 中 self 重复

Objective-C 风格问题 : do "release" or "nil" properties in dealloc?

ios - 为什么 CGContextAddArc 可以在 32 位设备上工作,但不能在 64 位设备上工作?