утечки памяти sqlite3 - PullRequest
       1

утечки памяти sqlite3

1 голос
/ 05 августа 2011

Я занимаюсь разработкой приложения, в котором интенсивно используется sqlite3, и столкнулся с огромной проблемой утечек памяти.

Каждый раз, когда я вызываю метод, который делает выбор, я получаю утечки памяти, когда добавляю объект в массив.

    - (void) makeSitesSelect:(NSString *)dbPath:(NSString *)theSelect {
    allSitesSelect = [[NSMutableArray alloc] init];
    sqlite3 *database;
    if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {
        const char *sql = [theSelect cStringUsingEncoding:NSASCIIStringEncoding];
        sqlite3_stmt *selectstmt;

        if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {
            while(sqlite3_step(selectstmt) == SQLITE_ROW) {
                NSMutableArray *selResult = [[NSMutableArray alloc] init]; // <---- Memory leak
                NSInteger selprimaryKey = sqlite3_column_int(selectstmt, 0);
                [selResult addObject:[NSString stringWithFormat:@"%i", selprimaryKey]]; //<--- memory leak

                const unsigned char *chsiteSite = sqlite3_column_text(selectstmt, 1);
                const unsigned char *chsiteCity = sqlite3_column_text(selectstmt, 2);
                const unsigned char *chsiteCountry = sqlite3_column_text(selectstmt, 3);
                const unsigned char *chsiteGPS = sqlite3_column_text(selectstmt, 4);

                if (chsiteSite != NULL) {
                    [selResult addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)]]; //<--- memory leak
                }
                else {
                    [selResult addObject:@""];
                }

                if (chsiteCity != NULL) {
                    [selResult addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 2)]]; //<---- memory leak
                }
                else {
                    [selResult addObject:@""];
                }
                if (chsiteCountry != NULL) {
                    [selResult addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 3)]]; //<---- memory leak
                }
                else {
                    [selResult addObject:@""];
                }
                if (chsiteGPS != NULL) {
                    [selResult addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 4)]]; //<---- memory leak
                }
                else {
                    [selResult addObject:@""];
                }
                [allSitesSelect addObject:selResult];
                [selResult release];
            }
            sqlite3_finalize(selectstmt);
        }
        sqlite3_close(database);
    }
    else
        sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.
}

Любая помощь приветствуется.

Спасибо, Max

Ответы [ 2 ]

0 голосов
/ 05 августа 2011

Вы пытаетесь вот так

if (!allSitesSelect)
{
 allSitesSelect = [[NSMutableArray alloc] init];
}

и освобождаете этот массив в dealloc

[allSitesSelect release];
0 голосов
/ 05 августа 2011

Если ваш allSitesSelect является свойством, вы всегда должны использовать self.allSitesSelect = [[NSMutableArray alloc] init]; и вы несете ответственность за освобождение после использования. и вы тоже не выпускаете базу данных.

вам не нужно создавать selResult каждый раз в цикле while

NSMutuableArray selResult*
while(sqlite3_step(selectstmt) == SQLITE_ROW) {
     if(selResult == nil){
         selResult = [NSMutuableArray copy] //Its an autorelease(you don't need
                                             //release explicitly )
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...