内存泄漏:如何停止?

时间:2011-11-17 12:14:41

标签: database ipad memory-leaks stringwithformat

You can see that memory leak error  我正在使用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);
}

3 个答案:

答案 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];

同样为其他人做。