освободить NSData в NSManagedObject - PullRequest
2 голосов
/ 22 января 2010

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

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

Теперь с 2 объектами загрузка 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.

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

Спасибо

Samuel

1 Ответ

1 голос
/ 22 января 2010

Очевидно, что что-то происходит с логикой создания ячейки таблицы. Давайте сначала посмотрим на типичный 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;

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

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

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

EDIT:

Предполагая, что с вашей ячейкой все в порядке, вам нужно сузить, если просачиваются видеоданные или данные изображения. Что такое 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];
    }
}
...