iPhone的内存问题?

时间:2009-05-15 10:37:17

标签: iphone objective-c

我正在使用单个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以最小内存利用率的最佳方法吗?

请简要解释一下,因为我需要在我的项目中使用图像数量,并且我希望避免因图像而导致的内存问题。

4 个答案:

答案 0 :(得分:3)

重新格式化您的代码,您的第二个示例是:

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

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

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

在最小化内存使用方面, [UIImage imageNamed:...] 方法会将图像存储在少量应用程序范围的缓存中,而您不会直接控制过度。缓存确实有一个上限限制,但是你无法将其刷新以回收内存,因此使用它会在你获取新的UIImages时增加内存占用量。

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

答案 1 :(得分:0)

我不是伟大的Objective-C专家,但你在B中的使用看起来应该没有泄漏。由于没有其他对象(UIImageView除外)保留UIImages,因此在UIImageView中替换它们时应该释放它们,垃圾收集器应该完成它的工作。

大卫

答案 2 :(得分:0)

使用+ 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 

答案 3 :(得分:0)

  

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

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

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