Проблема в управлении памятью? - PullRequest
0 голосов
/ 17 сентября 2010

Я разрабатываю приложение, в котором я работаю с базой данных. Метод, который я написал в классе базы данных следующим образом.

-(NSMutableArray *)getData: (NSString *)dbPath{
    NSMutableArray *dataArray = [[NSMutableArray alloc] init];

    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK){
        NSString *sqlQuery = [NSString stringWithFormat:@"SELECT empID, addText FROM Employee WHERE nameID = %@", nameID];
        sqlite3_stmt *selectstmt;
        if(sqlite3_prepare_v2(database, [sqlQuery UTF8String], -1, &selectstmt, NULL) == SQLITE_OK){

           while (sqlite3_step(selectstmt) == SQLITE_ROW){
                [dataArray addObject:[[NSMutableDictionary alloc] init]];

                [[dataArray lastObject] setObject:[NSString 
                                 stringWithFormat:@"%d", sqlite3_column_int(selectstmt, 0)] forKey:@"empID"];

                [[dataArray lastObject] setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt,1)] forKey:@"addText"];
            }
        }

        sqlite3_finalize(selectstmt);
    }
    sqlite3_close(database);
    return dataArray;
}

Приведенный выше код прекрасно работает на симуляторе, но не может работать на устройстве. Я также отслеживал утечки памяти, в которых я обнаружил утечку памяти в приведенном выше коде метода. Но я не могу решить эту утечку памяти.

Теперь я также обнаружил утечку памяти следующим способом.

  • (id) initWithString: (NSString *) str атрибуты: (NSDictionary *) атрибуты

{ if ((self = [super init])) { _buffer = [str mutableCopy]; _attributes = [NSMutableArray arrayWithObjects: [ZAttributeRun attributeRunWithIndex: 0 атрибуты: атрибуты], ноль]; } вернуть себя; }

Утечка рядом с _buffer = [str mutableCopy] ;. И след утечки дает мне в выходной непрерывно увеличивающееся выделение строки NSCFString. Как я поддерживаю это?

Заранее спасибо.

Ответы [ 4 ]

2 голосов
/ 17 сентября 2010

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

Что касается того, почему он «не работает» на устройстве, вам нужно более конкретно указать что случается, и почему это не то, что вы ожидаете.

1 голос
/ 17 сентября 2010

Ваш внутренний цикл пропускает объекты NSMutableDictionary, так как вы должны release их после добавления в массив, т.е.условность.Не уверен, что это утечка - зависит от того, как вы вызываете этот метод и освобождает ли возвращаемое значение.

Так что, возможно, используйте

return [dataArray autorelease];
1 голос
/ 17 сентября 2010

С первого взгляда у вас есть 2 места, где могут быть утечки:

NSMutableArray *dataArray = [[NSMutableArray alloc] init];
...
return dataArray;

Метод вызывающий отвечает за освобождение массива, возвращенного вашим методом - проверьте, если это так.

Кроме того, имя вашего метода не согласуется с рекомендациями obj-c - они предлагают, чтобы методы, возвращающие неавторизованный объект (так что вызывающий объект отвечает за их освобождение), должны содержать в своем имени create, alloc, copy Поэтому может быть лучше возвратить автоматически освобожденный массив (return [dataArray autorelease]; из этого метода и позволить вызывающей стороне решить, нужно ли ему сохранять массив или нет.

Второе место

[dataArray addObject:[[NSMutableDictionary alloc] init]];

Это утечка объекта словаря, вы, вероятно, должны просто написать

[dataArray addObject:[NSMutableDictionary dictionary]];
0 голосов
/ 17 сентября 2010

Ваш метод содержит два вызова +alloc, для которых нет соответствующих вызовов -release или -autorelease.

NSMutableArray *dataArray = [[NSMutableArray alloc] init];
...
[dataArray addObject:[[NSMutableDictionary alloc] init]];

Вы можете переписать эти строки, чтобы избавиться от утечки:

NSMutableArray *dataArray = [NSMutableArray array];
...
[dataArray addObject:[NSMutableDictionary dictionary]];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...