исправление утечки памяти iphone - PullRequest
0 голосов
/ 27 июля 2011

В моем приложении 3 утечки памяти, и я не могу найти, как это исправить.Я немного новичок в xcode и цели c.Вот код, который у меня есть:

if(sqlite3_prepare_v2( [[DatabaseController sharedDatabaseController] getDb], sqlQueryConverted, -1, &dbStatement, NULL)==SQLITE_OK){

        //Run the query
        while ( sqlite3_step(dbStatement) == SQLITE_ROW ) 
        {    


            const char *name = (const char *)sqlite3_column_text(dbStatement, 0);
            int courseId = sqlite3_column_int(dbStatement, 1);
            const char *location = (const char *)sqlite3_column_text(dbStatement, 2);
            const char *date = (const char *)sqlite3_column_text(dbStatement, 3);

            //Convert the returnedElement char to string
            nameConverted = [[NSString alloc] initWithUTF8String:name];
            locationConverted = [[NSString alloc] initWithUTF8String:location];
            dateConverted = [[NSString alloc] initWithUTF8String:date];

            Course *course = [[[Course alloc]initWithName:nameConverted _id:courseId location:locationConverted courseDate:dateConverted] autorelease];

            //Add the course to the to a temporary list to remove duplicated items            
            [tempResults addObject:course];

        }  
        [nameConverted release];
        [locationConverted release];
        [dateConverted release];
    }

Я тоже пытался выпустить его автоматически.Этот код используется для фильтрации поиска и перезагрузки таблицы отображения поиска.Если я добавлю строку release в оператор while, приложение будет аварийно завершено, если я введу 2 буквы.Как я могу это исправить?

Спасибо.

РЕДАКТИРОВАТЬ: Я без проблем возвращался к этой проблеме.Я пришел к выводу, что с инструментами что-то не так, потому что он все еще показывает утечки памяти.Вот код, который есть сегодня, и, как я считаю, должен решить проблему:

NSString *nameConverted = [[NSString alloc] initWithUTF8String:name];
            NSString *locationConverted = [[NSString alloc] initWithUTF8String:location];
            NSString *dateConverted = [[NSString alloc] initWithUTF8String:date];

            Course *course = [[[Course alloc]initWithName:nameConverted _id:courseId location:locationConverted courseDate:dateConverted] autorelease];

            //Add the course to the to a temporary list to remove duplicated items            
            [tempResults addObject:course];
            course = nil;
            [course release];
            [nameConverted release];
            nameConverted = nil;
            [locationConverted release];
            locationConverted = nil;
            [dateConverted release];
            dateConverted = nil;
            NSLog(@"course retain count %i",[course retainCount]);
            NSLog(@"name coverted retain count %i",[nameConverted retainCount]);
            NSLog(@"location coverted retain count %i",[locationConverted retainCount]);
            NSLog(@"date coverted retain count %i",[dateConverted retainCount]);

В журналах сообщается, что retainCount = 0;, поэтому я не понимаю, почему произошла утечка памяти.Ребята, можете дать мне какой-нибудь совет?

Еще раз спасибо.

Ответы [ 4 ]

2 голосов
/ 27 июля 2011

Вы протекаете в каждом цикле. Вы отпускаете только 3 последние строки NSString. Каждый раз, когда вы повторно назначаете новую NSString для ваших 3 переменных (nameConverted, locationConverted, dateConverted), вы теряете ссылку на объекты NSString, на которые они указывают. Это означает утечку памяти. Вы освобождаете только 3 последних из них, когда выходите из цикла «Пока».

1 голос
/ 27 июля 2011

Вы создаете блок памяти каждый цикл while, а затем освобождаете его только один раз. Таким образом, если ваш цикл while выполняется более 10 раз, каждая строка имеет счет сохранения 10, но освобождается только один раз.

Чтобы исправить, поместите ваши 3 релиза в цикл while следующим образом:

if(sqlite3_prepare_v2( [[DatabaseController sharedDatabaseController] getDb], sqlQueryConverted, -1, &dbStatement, NULL)==SQLITE_OK){

        //Run the query
        while ( sqlite3_step(dbStatement) == SQLITE_ROW ) 
        {    


            const char *name = (const char *)sqlite3_column_text(dbStatement, 0);
            int courseId = sqlite3_column_int(dbStatement, 1);
            const char *location = (const char *)sqlite3_column_text(dbStatement, 2);
            const char *date = (const char *)sqlite3_column_text(dbStatement, 3);

            //Convert the returnedElement char to string
            nameConverted = [[NSString alloc] initWithUTF8String:name];
            locationConverted = [[NSString alloc] initWithUTF8String:location];
            dateConverted = [[NSString alloc] initWithUTF8String:date];

            Course *course = [[[Course alloc]initWithName:nameConverted _id:courseId location:locationConverted courseDate:dateConverted] autorelease];

            //Add the course to the to a temporary list to remove duplicated items            
            [tempResults addObject:course];

        [nameConverted release];
        [locationConverted release];
        [dateConverted release];

        }  

    }
0 голосов
/ 28 февраля 2012

Вот как вы должны это делать.

NSString *nameConverted = [[NSString alloc] initWithUTF8String:name];
NSString *locationConverted = [[NSString alloc] initWithUTF8String:location];
NSString *dateConverted = [[NSString alloc] initWithUTF8String:date];

Course *course = [[Course alloc] initWithName:nameConverted _id:courseId location:locationConverted courseDate:dateConverted];
[tempResults addObject:course];
[course release];

[dateConverted release];
[locationConverted release];
[nameConverted release];
0 голосов
/ 27 июля 2011

Вы пытались использовать:

nameConverted = [[NSString initWithUTF8String:name] autorelease];
locationConverted = [[NSString initWithUTF8String:location] autorelease];
dateConverted = [[NSString initWithUTF8String:date] autorelease];

А удаление выпусков вне цикла? Также не удаляйте объект курса автоматически, отпустите его после добавления его в tempResults.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...