我有一个静态库,其中包含一个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,但不知道原因。
EDIT2:
目前我认为这一行有一个问题
database = [FMDatabase databaseWithPath:[self getDocumentResourcePath]]; 在这里我必须保留对象。
答案 0 :(得分:1)
您实际上并未指定单例实例:
if (!_sharedMySingleton)
[[self alloc] init];
应该是:
if (!_sharedMySingleton)
_sharedMySingleton = [[self alloc] init];
并转储覆盖alloc
方法。
同样database
应该是类中的实例变量,而不是全局范围。