утечка памяти iphone NSDictonary - PullRequest
2 голосов
/ 09 июня 2011

Я не очень знаком с управлением памятью в Objective-C, но я стараюсь изо всех сил.Мое приложение падает через несколько минут.С помощью инструментов я нашел много утечек.Иногда я просто забывал выпускать объекты или не помещать их в пул авто-релизов.Но сейчас я не знаю, где проблема в этом методе.Инструменты показывают утечки в 3 строки.

Спасибо за помощь.

- (NSMutableArray *)rowsFromTablePages {

NSString *sql = [NSString stringWithFormat:@"SELECT paid, creationdate, lastuseddate, image, background, backgroundid FROM Pages WHERE nsid=%i ORDER BY paid", _nsid];

sqlite3_stmt *statement;
NSMutableArray *allPages = [[[NSMutableArray alloc] init] autorelease];

  if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
      while (sqlite3_step(statement) == SQLITE_ROW) {
          int paid = (int)sqlite3_column_int(statement, 0);
          char *creationdate = (char *)sqlite3_column_text(statement, 1);
          char *lastuseddate = (char *)sqlite3_column_text(statement, 2);
          NSData *data = [NSData dataWithBytes:sqlite3_column_blob(statement, 3) length:sqlite3_column_bytes(statement, 3)]; // Leak
          NSData *databg = [NSData dataWithBytes:sqlite3_column_blob(statement, 4) length:sqlite3_column_bytes(statement, 4)]; // Leak
          int bgid = (int)sqlite3_column_int(statement, 5);

          NSDictionary *rowInArray = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:paid], @"PAID", [NSString stringWithUTF8String:creationdate], @"CREATIONDATE", [NSString stringWithUTF8String:lastuseddate], @"LASTUSEDDATE", [UIImage imageWithData:data], @"THUMBNAIL", [NSNumber numberWithInt:bgid], @"BGID", [UIImage imageWithData:databg], @"THUMBNAILBG", nil]; // Leak

          [allPages addObject:rowInArray];
      }
      sqlite3_finalize(statement);
  }
  return allPages;
}

В том же классе Инструменты показывают утечку, где этот метод вызывается.

- (void)reloadDataFromSQL {
    _dataSource = [[NSMutableArray alloc] initWithArray:[self rowsFromTablePages]]; // Leak
    [self.tableView reloadData];
}

Ответы [ 4 ]

1 голос
/ 09 июня 2011

Попробуйте использовать +dataWithBytesNoCopy:length: вместо -dataWithBytes:length:.Это гарантирует, что байты не копируются, что должно остановить утечку.

1 голос
/ 09 июня 2011

В методе reloadDataFromSQL вы выделяете новую память для экземпляра NSMutableArray, не освобождая ничего.

1 голос
/ 09 июня 2011

Сколько раз вы запускаете этот цикл while?Я подозреваю, что, возможно, пул авто-релиза перегружен и генерирует ошибку памяти.Попробуйте объявить переменные вне цикла while и вручную освободить их.Дайте мне знать, как это работает.

0 голосов
/ 09 июня 2011

попробуйте это, если это работает .... если (_dataSource)

{

_dataSource = [self columnsFromTablePages];

}

еще {

_dataSource = [[NSMutableArray alloc] initWithArray: [self rowFromTablePages]]; // Утечка

}

[self.tableView reloadData];

...