我正在使用NSObject类从数据库中获取所有数据。当我调用该函数时,它将显示内存泄漏,我使用stringWithFormat分配一个字符串。我认为当我们使用这种方法时,我们不应该释放该字符串,为什么它会显示内存泄漏?
提前致谢。 :)
- (void) Allnote
{
[app.NoteArray removeAllObjects];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Notes.sqlite"];
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat:@"SELECT * From note" ];
const char *sql = [querySQL UTF8String];
sqlite3_stmt *searchStatement;
if (sqlite3_prepare_v2(database, sql, -1, &searchStatement, NULL) == SQLITE_OK)
{
while (sqlite3_step(searchStatement) == SQLITE_ROW)
{
noteClass *noteObj = [[noteClass alloc]init];
noteObj.noteTitle = [NSString stringWithUTF8String:(char *)sqlite3_column_text(searchStatement, 0)]; // at this place
noteObj.noteContent = [NSString stringWithUTF8String:(char *)sqlite3_column_text(searchStatement, 1)]; // at this place
NSNumber *noteId = [NSNumber numberWithInt:sqlite3_column_int(searchStatement, 2)];
noteObj.noteId = [NSString stringWithFormat:(@"%@"),noteId]; // at this place
files=noteObj.noteTitle;
filescont=noteObj.noteContent;
[app.NoteArray addObject:noteObj];
[noteObj release];
}
}
sqlite3_finalize(searchStatement);
}
sqlite3_close(database);
}
答案 0 :(得分:2)
如果您不使用格式,那么为什么要使用stringWithFormat
NSString *querySQL = [NSString stringWithFormat:@"SELECT * From note" ];
与:
相同NSString *querySQL = @"SELECT * From note";
你是对的,你没有释放它们。
答案 1 :(得分:1)
请参阅,stringWithFormat
是一种工厂方法,意味着它的定义中有自动释放,这就是为什么你会遇到内存问题。但是,这不是问题。100%完美。
答案 2 :(得分:1)
除了Surya Kant的回答,我还在回答。
这不是问题。但是,如果你想避免这个问题,请继续努力。
而不是以下行,
noteObj.noteTitle = [NSString stringWithUTF8String:(char *)sqlite3_column_text(searchStatement, 0)]; // at this place
执行以下操作
NSString *noteTit = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(searchStatement, 0)];
noteObj.noteTitle = noteTit;
[noteTit release];
同样为其他人做。