iPhone 应用程序内存泄漏与 NSMutableArray 中的 UIImages

Posted

技术标签:

【中文标题】iPhone 应用程序内存泄漏与 NSMutableArray 中的 UIImages【英文标题】:iPhone app memory leak with UIImages in NSMutableArray 【发布时间】:2014-01-29 15:53:31 【问题描述】:

我有一个包含图像的 NSMutableArray。然后我有一个图像视图,显示该数组中的图像。但是,每次加载图像视图时都会发生很大的内存泄漏。我不知道如何纠正。我在 Xcode 5.0.2 中使用 ARC。

_image1 = [UIImage imageNamed:@"FirstImage.png"];

imagearray = [[NSMutableArray alloc] init];

[imagearray addObject:_image1];

_imageview1 setImage:[imagearray objectAtIndex:0]];

【问题讨论】:

这段代码在哪里,这是在某个块中吗?请添加更多代码...! 内存泄漏怎么看? 在调试导航器上 - xcode 中的内存报告。 视图中有多少张图片可见? 它是 ARC。有 5 张图片可见。 【参考方案1】:

内存泄漏问题可能是由于 UIImage 没有变为零。为此,您必须使用 alloc 初始化 UIImage,然后将其添加到数组中,使其为零。您可以通过这种方式防止内存泄漏:

UIImage *image1 =[[UIImage alloc]initWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"FirstImage" ofType:@"png"]];
[imagearray addObject:image1];
_imageview1 setImage:[imagearray objectAtIndex:0]];
image1 =nil;

请让我知道它是否有效。谢谢:)

【讨论】:

【参考方案2】:

来自苹果文档: + (UIImage)imageNamed:方法在系统缓存中查找具有指定名称的图像对象,如果存在则返回该对象。 如果匹配的图像对象尚未在缓存中,则此方法 从指定文件加载图像数据,缓存,然后 返回结果对象。

如果您有一个只显示一次的图像文件并希望 确保它不会被添加到系统的缓存中,您应该 而是使用 imageWithContentsOfFile: 创建您的图像。这会 将您的一次性图像保留在系统图像缓存之外,可能 改善应用的内存使用特性。

因此作为建议,如果您将 imageNamed: 替换为 imageWithContentsOfFile: 以避免缓存,您的内存占用应该会有所改善

【讨论】:

我已经尝试过了,但是泄漏来自 setImage,而不是 imageNamed 部分。

以上是关于iPhone 应用程序内存泄漏与 NSMutableArray 中的 UIImages的主要内容,如果未能解决你的问题,请参考以下文章

内存泄漏与自动释放的字符串 iphone

iPhone 应用程序内存泄漏与 NSMutableArray 中的 UIImages

iPhone ABPeoplePickerNavigationController 内存泄漏

如何检测 iPhone 上的内存泄漏?

iPhone - Objective-C - 内存泄漏与 initWithArray

iPhone - SBJsonParser 的另一个 Objective-C 内存泄漏