Утечка памяти: как остановить?

Вы можете видеть эту ошибку утечки памятиЯ использую класс 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);
}

person Chirag Patel    schedule 17.11.2011    source источник
comment
noteId — свойство экземпляра noteClass? Вы перезагружаете его реализацию, может быть, вы пишете для него какой-то собственный сеттер и делаете там что-то не так с памятью?   -  person Serhii Mamontov    schedule 17.11.2011
comment
noteObj — это класс типа NSObject, а noteId — это поле этого класса. название ??   -  person Chirag Patel    schedule 18.11.2011


Ответы (3)


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

person iCoder4777    schedule 17.11.2011
comment
Как я уже сказал, у вас есть утечка в вашем коде из-за фабричного метода, но это не проблема. Вам не нужно об этом беспокоиться. - person iCoder4777; 18.11.2011
comment
я добавил снимок экрана. так что теперь вы можете проверить, где именно отображается предупреждение об утечке памяти ... это прекрасно, но почему он показывает мне ошибку утечки памяти !! - person Chirag Patel; 18.11.2011
comment
это из-за авторелиза. видите, утечка показывает, что вы не освободили выделенную память для этого объекта. Но из-за автовыпуска, который будет выполнен на более позднем этапе, вы получите массаж утечки, но вам не нужно об этом беспокоиться. - person iCoder4777; 18.11.2011
comment
на что указывает эта фиолетовая полоса..?? - person Chirag Patel; 18.11.2011
comment
этот вопрос вы получите, но вам не нужно беспокоиться об этом. Или, если вы не хотите никаких проблем, обратитесь к ответу Гомати. Тогда у вас не будет никаких проблем. - person iCoder4777; 18.11.2011

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

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

Такой же как:

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

И вы правы, вы не должны их выпускать.

person rckoenes    schedule 17.11.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];

Точно так же делайте это для других.

person Ilanchezhian    schedule 18.11.2011
comment
noteObj.noteTitle = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(searchStatement, 0)]; [релиз noteObj.noteTitle]; как вы предлагаете, я все еще предупреждаю об утечке памяти :( - person Chirag Patel; 18.11.2011
comment
Просто проверьте в Инструментах, кто (какая библиотека) отвечает за утечку. - person Ilanchezhian; 18.11.2011
comment
Тогда это не твоя вина. Библиотека Foundation справится с этим. - person Ilanchezhian; 18.11.2011