Утечка памяти: как остановить? - PullRequest
1 голос
/ 17 ноября 2011

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 ]

2 голосов
/ 17 ноября 2011

Если вы не применяете формат, то зачем использовать stringWithFormat

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

Так же, как:

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

И вы правы, у вас их нет.

1 голос
/ 18 ноября 2011

Я отвечаю в дополнение к ответу Сурьи Канта.

С этим проблем не было. Но все же, если вы хотите предотвратить проблему, пожалуйста, сделайте это.

Вместо следующей строки,

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

Аналогичным образом сделайте это для других.

1 голос
/ 17 ноября 2011

Видите, stringWithFormat - это заводской метод, это означает, что он имеет авто-релиз в своем определении, поэтому у вас возникает проблема с памятью.Но это не проблема. Это на 100% идеально.

...