выпустить NSData в NSManagedObject

Я использую модель данных для хранения двух объектов: видео, изображений. Видео содержит только строковые атрибуты, а изображения имеют 2 атрибута «Двоичные данные».

Вначале в видеообъекте были 2 атрибута двоичных данных. Но все видео загружаются во время инициализации UITableView. Для 400 видео двоичные данные представляют 20 Мо, так что представьте, с 4000 видео ...

Теперь с двумя объектами загрузка UITableView работает хорошо. Я загружаю двоичные данные, когда это необходимо в методе: tableView: cellForRowAtIndexPath

Но теперь больше прокручиваю по списку, тем больше подрастает память :(

посмотри на мой метод:

- (UITableViewCell *)tableView:(UITableView *)myTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"videoCell";
    Video *theVideo = (Video *)[[self fetchedResultsController] objectAtIndexPath:indexPath];
    VideoCellViewController *cell = (VideoCellViewController *)[myTableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"VideoCellView" owner:self options:nil];
        cell = editingTableViewCell;
        self.editingTableViewCell = nil;
    }
    cell.video = theVideo;
    return cell;
}

И метод setvideo в VideoCellViewController

- (void)setVideo:(Video *)newVideo {
    if (newVideo != video) {
        [video release];
        video = [newVideo retain];
    }
    NSData *imageData = [video.allImages valueForKey:@"thumbnailImage"];
    UIImage *uiImage = [[UIImage alloc] initWithData:imageData];
    smallImage.image = uiImage;
    nameLabel.text = video.displayName;
    [uiImage release];
}

Даже без установки smallImage у меня проблемы с памятью. Если я загружаю объект изображения, он никогда не освобождается.

Я пробую много решений для освобождения памяти безуспешно ... (didTurnIntoFault, release, CFRelease ...) В инструменте повышения производительности я вижу свои двоичные данные как CFData.

Я использую много примеров iPhoneCoreDataRecipes и PhotoLocations.

Мне нужна помощь, чтобы очистить память;)

Спасибо

Самуэль


person Samuel    schedule 22.01.2010    source источник
comment
Откуда editingTableViewCell?   -  person slf    schedule 22.01.2010


Ответы (1)


Очевидно, что-то происходит с вашей логикой создания ячейки таблицы. Давайте сначала рассмотрим типичный cellForRow обработчик делегата.

static NSString *MyIdentifier = @"MyIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
if (cell == nil) {
     cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
}
// do stuff with cell
return cell;

Здесь мы видим, что мы

  • пытаюсь получить многоразовую ячейку
  • если это не удается (nil), создайте новый и передайте повторно используемый идентификатор ctor
  • затем сделайте что-нибудь с ячейкой (новой или существующей) и верните ее

Если вы не укажете ячейку для повторного использования в табличном представлении, вы всегда будете получать нулевую ячейку, возвращаемую из очереди, следовательно, необходимо каждый раз создавать новые ячейки. Это приведет к тому, что объем памяти продолжит увеличиваться при прокрутке, но останется довольно плоским в режиме ожидания.

РЕДАКТИРОВАТЬ:

Предполагая, что с вашей ячейкой все в порядке, вам нужно сузить область, если утечка видеоданных или данных изображения. Что такое smallImage? А вы уверены, что не хотите делать все только тогда, когда видео новое?

- (void)setVideo:(Video *)newVideo {
    if (newVideo != video) {
        [video release];
        video = [newVideo retain];
        NSData *imageData = [video.allImages valueForKey:@"thumbnailImage"];
        UIImage *uiImage = [[UIImage alloc] initWithData:imageData];
        smallImage.image = uiImage;
        nameLabel.text = video.displayName;
        [uiImage release];
    }
}
person slf    schedule 22.01.2010
comment
повторное использование ячеек хорошо работает в моем проекте (я определяю cellIdentifier в файле пера). С журналом я увидел создание всего 8 ячеек. Я действительно думаю, что это проблема с выпуском двоичных данных. - person Samuel; 22.01.2010
comment
Спасибо за помощь;) smallImage - это определение UIImageView в пере. Но даже без установки smallImage у меня проблема с памятью :( Просто valueForKey создает проблемы. Он никогда не выпускается после ... Может быть, мне нужно сказать NSManagedObjectContext, чтобы он подавил объект в памяти на данный момент. - person Samuel; 22.01.2010
comment
вы выпускаете видео в блоке dealloc? - person slf; 22.01.2010
comment
Я думаю, мне нужно было бы увидеть больше вашего кода, чтобы помочь вам в этом - person slf; 23.01.2010
comment
возможно, решение состоит в том, чтобы сохранить изображение в файле, а не в базе данных. например: stackoverflow.com/questions/1015713/ - person Samuel; 23.01.2010
comment
Я думаю, что это лучшая идея, к сожалению, утечка - это утечка, и если вы пропускаете видео сейчас, вы просто потеряете путь позже. Вам действительно следует найти то, что протекает, и исправить это. Время достать инструменты - person slf; 24.01.2010
comment
Да, но утечки больше нет, если изображения в файлах ... Возможно, проблема с управлением NSData. Раньше, когда я прокручиваю, память менялась с 3 до 20 месяцев (и больше ...), а теперь составляет 3 месяца (даже со списком из 4000 фильмов ...) - person Samuel; 24.01.2010
comment
Я хотел бы сообщить об этом, убедитесь, что вы прикрепили свой пример кода developer.apple.com/bugreporter - person slf; 25.01.2010