Утечки памяти - возвращение NSMutableArray из метода класса, содержащего пользовательские объекты - PullRequest
1 голос
/ 09 марта 2011

Я использую класс DBManager для повторного запуска данных из базы данных SQlite.Класс содержит методы, которые возвращают MutableArray, извлекая его из базы данных.как ниже ..

+ (NSMutableArray *) getSaleForYear : (NSString *) year {

    if ([DBManager openDBConnection]) {

        NSMutableArray * sales = [[NSMutableArray alloc] initWithCapacity:1];

        const char *q = "SELECT sales, quarter FROM sale where year like ? order by quarter";
        sqlite3_stmt *selectstmt;
        if (sqlite3_prepare_v2(database, q, -1, &selectstmt, NULL) == SQLITE_OK) {

            if(sqlite3_bind_text(selectstmt, 1, [year UTF8String] , -1, SQLITE_TRANSIENT) != SQLITE_OK){
                NSLog(@"bind error : %@", [NSString stringWithUTF8String: sqlite3_errmsg(database)]);
                return nil;
            }

            while(sqlite3_step(selectstmt) == SQLITE_ROW) {
                float sale = sqlite3_column_double(selectstmt, 0);
                    //NSString * quarter = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];
                NSString * quarter = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];

                ChartData * b1 = [[ChartData alloc] initwithdata:quarter y:sale];
                [sales addObject:b1];
                [b1 release];
                [quarter release];
            }
        }

        sqlite3_finalize(selectstmt);
        [DBManager closeDBConnection];
        return [sales autorelease];
    }else {
        return nil;
    }
}

И я вызываю метод как.

- (IBAction) getData {

    NSLog(@"getdata");

    if (arr != nil) {
        for (ChartData * cd in arr) {
            [cd release];
        }
        arr = nil;
        [arr release];
    }

    arr = [[DBManager getSaleForYear:@"2010-11"] copy];
    NSLog(@"count %d ", [arr count]);
}

Этот подход создает утечки памяти для итеративных вызовов функции.Пожалуйста, предложите причину утечки и решение.

Ответы [ 2 ]

2 голосов
/ 09 марта 2011
  1. Вы устанавливаете arr = nil перед его освобождением, это [arr release] не имеет никакого эффекта
  2. Вы не должны проходить через массив и освобождать каждый объект (см. Комментарий к fluchtpunkt ниже).
  3. Нет необходимости проверять arr == nil отправка сообщений на ноль действительна.

Я бы написал:

- (IBAction)getData {
    NSLog(@"getdata");

    [arr release];

    arr = [[DBManager getSaleForYear:@"2010-11"] copy];
    NSLog(@"count %d ", [arr count]);
}
1 голос
/ 09 марта 2011

Вам, вероятно, следует инвертировать эти строки кода:

arr = nil;
[arr release];

следующим образом:

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