【问题标题】:Leak when assigning regions of a UIImage to UIImageView animationImages将 UIImage 的区域分配给 UIImageView 动画图像时泄漏
【发布时间】:2012-04-13 13:29:59
【问题描述】:

我有一个 UIImage 类别方法可以做到这一点:

- (UIImage *)subimageInRect:(CGRect)rect {

    CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], rect);
    UIImage *answer = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);
    return answer;
}

还有另一种分类方法,它将一个短而宽的图像(如胶片)切成 N 个比例更均匀的图像(如帧),如下所示:

- (NSArray *)subimagesHorizontally:(NSInteger)count {

    NSMutableArray *answer = [NSMutableArray arrayWithCapacity:count];
    CGFloat width = self.size.width / count;
    CGRect rect = CGRectMake(0.0, 0.0, width, self.size.height);

    for (int i=0; i<count; i++) {
        [answer addObject:[self subimageInRect:rect]];
        rect = CGRectOffset(rect, width, 0.0);
    }
    return [NSArray arrayWithArray:answer];
}

这些被分配了 UIImageView 的 highlightAnimationImages 属性,其中一些包含在一个表中。 (并以标准方式处理。故事板原型单元格,使用 [cell viewWithTag:...] 在数据源中进行标记和访问)。

它运行良好,但只要表加载,泄漏就会报告泄漏。谁能帮我找出我做错了什么?

【问题讨论】:

  • 忘了说这是在 ARC 中。

标签: iphone ios memory-leaks uiimageview uiimage


【解决方案1】:

首先,您发布的代码不会创建可调整大小图像,也不会调用resizableImageWithCapInsets:,因此前两个泄漏与代码无关。同样,最后两次泄漏发生在[UIImageView setAnimationImages]您发布的代码没有调用。我会看看在您取消分配图像视图后是否仍然报告泄漏。如果图像视图位于可重用的表格视图单元格中,那可能会使 Instruments 感到困惑。事实上,在这种情况下,动画图像只能与 table view 本身一起被释放。

简而言之,您应该查看相关方法(顺便说一下,Instruments 还可以显示它认为发生泄漏的堆栈跟踪)。您发布的代码绝对没问题,ARC 与否。

【讨论】:

  • 谢谢。我也应该提到这一点:我从不使用 resizableImageWithCapInsets: 或 setAnimationImages 方法。我猜(我猜错了)我的代码间接使用了这些。
  • 再次感谢。也许我应该这样问:你认为我可以得出结论,如果我的应用程序没有出现在负责的库列中,检测到的泄漏是模拟器的泄漏,我应该忽略它们吗?
  • 您应该检查泄漏的堆栈跟踪。您可能会泄漏在内部使用可调整大小的图像的 UIKit 视图。但是,即使是真的,它也与您在问题中发布的代码没有任何关系。那个代码很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-15
相关资源
最近更新 更多