【问题标题】:Virtual Memory Exhaustion - Is This To Blame?虚拟内存耗尽——这是罪魁祸首吗?
【发布时间】:2014-06-27 10:08:14
【问题描述】:

当我浏览我的应用程序时,我的虚拟内存不断增加,这会导致性能不佳并最终导致内存压力崩溃。应用程序物理内存从不超过 10mb 到 20mb,但虚拟内存在崩溃时达到了 200mb 到 300mb 的峰值。

我正在使用 ARC。

基本上,我认为问题在于我对 cellForRowAtIndexPath / itemForRowAtIndexPath 方法所采用的方法,因为该应用非常强烈地基于通过表格视图和集合视图提供的内容。

基本上,我所做的是将注册到自定义 XIB 文件的单元格出列,这些文件没有类文件(我认为这是问题所在),然后通过标签而不是它们作为类并访问它们的属性。

根据我的代码和收集到的信息,我假设任何时候我的集合视图或表格重新加载,它基本上都创建了额外的单元格,因为单元格已经创建,所以它只是在相同的单元格上覆盖相同的内容?那个或使用 UILabel *name = (UILabel *)etc.. 正在增加不应该的地方的引用计数,这导致内存使用量猛增,因为对象没有被释放?

这是应用程序中用于创建项目的最密集部分之一的代码片段,我的逻辑/流程是否会导致我的虚拟内存问题?

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:PRODUCTS_FEED_CELL_IDENTIFIER forIndexPath:indexPath];
    NSDictionary *product = [self.productsFeedItems objectAtIndex:indexPath.row];

    UIImageView *productThumbnailView = (UIImageView *)[cell viewWithTag:PRODUCTS_FEED_COLLECTION_ITEM_TAG_THUMBNAIL];
    [productThumbnailView setImageWithURL:[APIController resourceUrlForUserId:[product objectForKey:@"userId"] resourceName:[product objectForKey:@"thumbnail"]]];

    UILabel *productPriceLabel = (UILabel *)[cell viewWithTag:PRODUCTS_FEED_COLLECTION_ITEM_TAG_PRICE];
    productPriceLabel.text = [NSString stringWithFormat:@"$%@", [product objectForKey:@"price"]];

    NSString *likeImage = ([[product objectForKey:@"liked"] isEqualToString:@"1"]) ? @"feedLikeSelected.png" : @"feedLikeUnselected.png";
    UIButton *productLikeButton = (UIButton *)[cell viewWithTag:PRODUCTS_FEED_COLLECTION_ITEM_TAG_LIKE];
    [productLikeButton setImage:[UIImage imageNamed:likeImage] forState:UIControlStateNormal];

    return cell;
}

堆分配和仪器屏幕截图

【问题讨论】:

  • 请添加可编辑的代码,而不是图片

标签: ios iphone objective-c xcode cocoa-touch


【解决方案1】:

问题可能来自您尝试从服务器获取的图像非常大的事实。使用setImageWithURL: 检查您设置的图像的大小。另外,您是否正在缓存这些图像?

【讨论】:

  • 我正在使用 SDWebImage,所以这些图像确实被缓存了。大多数图像是 640x640。根据使用/缩放的位置为每个图像创建缩略图图像变体可能会有所帮助。但我无法想象这是 VM 飙升至 200mb / 300mb 的原因?无论如何,在应用内的视图之间导航时,这些图像视图不应该被释放并从内存中释放吗?
  • 您是否尝试过使用内存分析来查看哪些对象最消耗内存?我认为内存中保留的 640x640 图像是问题的实际根源。
  • 在原帖中添加了两张截图。
  • 只是为了测试,我使用批处理将我的应用从服务器拉取的所有图像从 640x640 缩小到 64x64,以查看这是否是问题所在,但显然不是。该应用程序在使用一段时间后仍然变得缓慢并崩溃..非常混乱。
  • 这确实很奇怪...好吧,您可以尝试将部分代码逐个注释掉,并尝试确定您的内存消耗何时开始飙升。
猜你喜欢
  • 2015-04-09
  • 1970-01-01
  • 2015-04-04
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-20
相关资源
最近更新 更多