我有一個靜態庫,其中包含一個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]]; 這裏我必須保留這個對象。
如果單身人士「管理」數據庫,那麼這意味着在邏輯上它是*數據庫*被過早釋放。 – CodaFi 2013-03-05 14:33:40
只有當我從庫側調用單例時纔會發生......我無法找到數據庫爲什麼被釋放的原因 – Sebastian 2013-03-05 14:35:22
如果你在單例中有強烈的引用,那麼它不應該被釋放。運行殭屍工具,看看發生了什麼。 – CodaFi 2013-03-05 14:39:16