gpt4 book ai didi

ios - iOS静态库中的单例

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:44:37 24 4
gpt4 key购买 nike

我有一个静态库,其中包含一个 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com