iPhone内存问题?

Posted

技术标签:

【中文标题】iPhone内存问题?【英文标题】:Memory issue in iPhone? 【发布时间】:2009-05-15 10:37:16 【问题描述】:

我使用单个 UIImageView 对象,分配一次内存。但是多次更改图像名称。 问题是,

A) 一个 UIImageView 对象,分配一次并且永远不会更改图像名称。 例如 UIImageView *firstObj = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"blue.png"]];

B) 另一个 UIImageView 对象,分配一次并多次更改图像名称

例如 UIImageView *secondObj = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"blue.png"]];

//更改图像名称一次,

secondObj.image = [UIImage imageNamed:@"green.png"];

 and so on....

哪些对象使用最大内存或使用相同内存?

在内存利用率最低的情况下,使用 secondObj 的最佳方式是什么?

请简要解释一下,因为我需要在我的项目中使用图像数量,并且我想避免由于图像引起的内存问题。

【问题讨论】:

【参考方案1】:

重新格式化你的代码,你的第二个例子是:

UIImageView *secondObj = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"blue.png"]];
// changed image name once
secondObj.image = [UIImage imageNamed:@"green.png"];
// and so on....

这段代码很好。当您将图像分配给 UIImageView 的实例时,它会将图像的保留计数增加一。如果一个图像已经被分配,它将首先释放它。

由于 [UIImage imageNamed:...] 将为您提供已标记为自动释放的对象,您可以继续分配图像,如示例所示,不会出现内存泄漏。一旦 UIImageView 释放现有的图像,它就会被一个自动释放池收集。

在最小化内存使用方面,[UIImage imageNamed:...] 方法确实将图像存储在少量应用程序范围的高速缓存中,您不施加任何直接控制超过。缓存确实有上限,但你不能刷新它来回收内存,所以在你获取新的 UIImage 时使用它会增加你的内存占用。

您可能需要考虑通过使用 [UIImage imageWithData:...] 来加载您的图像来避免此缓存,这在 *** 问题 [UIImage imageNamed…] vs [UIImage imageWithData…] 中进行了讨论.

【讨论】:

其他人指出 imageNamed: 由于缓存问题,对内存消耗非常不利。我什至会使用 initWithData: 手动初始化 UIImage:并在 UIImageView 初始化或 UIImageView 图像更改后立即释放它,只是为了避免在自动释放池中堆积。【参考方案2】:

我不是出色的 Objective-C 专家,但您在 B 中的使用看起来应该可以正常工作而不会泄漏。由于没有其他对象(UIImageView 除外)保留 UIImage,因此当它们在 UIImageView 中被替换时应该释放它们,并且垃圾收集器应该完成它的工作。

大卫

【讨论】:

谢谢大卫,你能简单解释一下吗?【参考方案3】:

使用 +imageNamed: 创建的 UIImage 是自动释放的,因此它会消失。举个例子:

UIImage *image1 = [UIImage imageNamed:@"blue.png"]; //image1 has retain count 1
[myImageView setImage:image1]; //image1 is retained by UIImageView so has retain count 2

//run loop ends, all auto released objects are released and image1 now has retain count 1

//Later in app

UIImage *image2 = [UIImage imageNamed:@"green.png"]; //image2 has retain count 1
[myImageView setImage:image2]; //image1 is released and now has retain count 0, so the memory is freed, image2 now has retain count 2 as it is retained 

【讨论】:

【参考方案4】:

由于没有其他对象(UIImageView 除外)保留 UIImage,因此在 UIImageView 中替换它们时应该释放它们,并且垃圾收集器应该完成它的工作。

请记住,iPhone 上没有垃圾收集器。 您可以在此处找到更多相关信息:***:Is garbage collection supported for iPhone applicaions?

(这实际上应该是对戴维斯回答的评论,但我还没有足够的声誉)

【讨论】:

以上是关于iPhone内存问题?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone内存问题?

iPhone 内存释放问题

iphone内存管理问题

iPhone 应用程序内存问题

读取视频帧 iPhone 时出现内存问题

Xcode - Iphone 内存限制