2

我使用数据模型来存储 2 个对象:视频、图像。视频仅包含字符串属性,图像具有 2 个“二进制数据”属性。

开始时 2 个二进制数据属性位于视频对象中。但是所有视频都是在 UITableView 初始化期间加载的。对于 400 个视频,二进制数据代表 20 Mo,所以想象一下 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;
}

以及 VideoCellViewController 中的 setvideo 方法

- (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 示例。

我需要帮助来清理我的记忆;)

谢谢

塞缪尔

4

1 回答 1

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)创建一个新的并将可重用的 id 传递给 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];
    }
}
于 2010-01-22T18:56:02.817 回答