我正在使用单个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以最小内存利用率的最佳方法吗?
请简要解释一下,因为我需要在我的项目中使用图像数量,并且我希望避免因图像而导致的内存问题。
答案 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答案的评论,但我还没有足够的声誉)