2

可以看到内存泄漏错误 我正在使用 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);
}
4

3 回答 3

2

如果您没有应用格式,那么为什么要使用stringWithFormat

NSString *querySQL = [NSString stringWithFormat:@"SELECT * From note" ];

是相同的:

NSString *querySQL = @"SELECT * From note";

你是对的,你没有释放它们。

于 2011-11-17T12:20:42.757 回答
2

看,stringWithFormat是一个工厂方法意味着它的定义中有自动释放,这就是你遇到内存问题的原因。但是,这不是问题。它 100% 完美。

于 2011-11-17T12:32:55.790 回答
1

除了苏里亚康德的回答之外,我还在回应。

这不是问题。但是,如果你想避免这个问题,请做一件事。

而不是以下行,

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

同样为别人做。

于 2011-11-18T06:16:19.733 回答