Iphone 内存管理UIImage ImageName

Iphone 内存管理UIImage ImageName,iphone,cocoa-touch,memory-management,uiimage,Iphone,Cocoa Touch,Memory Management,Uiimage,我在viewcontroller中加载了很多相当大的图像,使用 NSUInteger nimages = 0; for (; ; nimages++) { NSString *nameOfImage_ = @"someName"; NSString *imageName = [NSString stringWithFormat:@"%@%d.jpg", nameOfImage_, (nimages + 1)]; image = [UIImage imageName

我在viewcontroller中加载了很多相当大的图像,使用

NSUInteger nimages = 0;

for (; ; nimages++) {

    NSString *nameOfImage_ = @"someName";

    NSString *imageName = [NSString stringWithFormat:@"%@%d.jpg", nameOfImage_, (nimages + 1)];

    image = [UIImage imageNamed:imageName];
    if (image == nil) {
        break;
    }

    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];

    //some other stuff....

    [imageView release];
}
通常的卸载发生在-voidviewDidUnload和-voiddealloc中 具有self.image=nil;和[图像发布]

似乎在加载和卸载几次之后,缓存仍然增长到无法返回的地步!! :

应用程序崩溃了

有什么想法吗???如何清空缓存?在哪里

谢谢

编辑:

好吧,这就是我做错的地方。 显然,这段代码修复了整个缓存问题:

image = [[UIImage imageNamed:imageName] autorelease];
自动释放是这里的关键

感谢您的回复…

imageNamed是一种可怕的加载图像的方法。实际上,除非强制加载,否则它不会释放加载的图像,并将其永久保存在缓存中。您应该实现自己的、更智能的缓存。简单的NSMutableDictionary提供了相同的功能,但具有更大的灵活性


有关更深入的讨论,请阅读以下内容:

使用其他方法初始化图像。imageNamed缓存。

不使用imageNamed,您可以使用ImageWithContents文件: 或者看看这篇文章

这是不正确的。按照内存管理规则,您不应该释放或自动释放映像,因为您没有分配或保留它。imageNamed不包含alloc、new、copy或retain


正如其他一些答案所解释的,如果您想更好地控制图像使用的内存,则应使用不同的方法加载图像。

谢谢大家的建议

解决方案: 使用ARC和ImageWithContentsOffile初始化图像

image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:imageName ofType:nil]];

是的,ImageName只适用于。。。没什么大不了的…

我做了,但image=[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:imageName of type:nil];崩溃速度比以前快!!还尝试使用ARC。起初它似乎在工作,但后来又崩溃了!是否实际调用了dealloc和viewDidUnload?在这些方法中添加一些NSLog以确保。如何创建视图?您似乎在内存管理方面存在一些问题,因此您的视图可能比您想象的要长。这个视图保存了所有图像视图,它们都有一个对图像的引用。这就是为什么他们从未被释放。是的,观点确实存在。我尝试过viewDidDissapear来释放、移除SuperView、=nil,但仍然得到内存警告,最终崩溃。真的吗?那个FUD还在绕圈子?导致ImageName:从不清空其缓存的错误在3年前已经修复。也许是时候更新你的书签了。在我的h。头我这样做:@property非原子,retain UIImage*image;所以我想它可以自动释放。我错了吗?是的,你错了。如果缓存决定释放映像,会发生什么情况?现在有一个指向不存在的对象的指针。或者,如果将图像属性设置为nil,则会导致图像被释放,UIImage的缓存将具有错误的指针。执行此操作:从代码中删除自动释放。处理完图像后,将图像属性设置为nil。这就是你的全部责任。更好的是:切换到ARC并让编译器处理内存管理。ARC仍然会使我的应用程序崩溃。尽管这样做需要更长的时间。我会尝试将图像置零…将图像置零后,应用程序的寿命是以前的三倍。这次我没有收到任何mem警告,但是。。。你猜怎么着??它又崩溃了。。。如果加载/选择了两个连续的查看器或包含同一系列图像的同一查看器,则应用程序将崩溃,原因是图像先前已为零???对吗?那么我该如何解决这个问题呢?嗨,我也遇到了同样的问题,我照你说的做了,但现在它很滞后,崩溃得更快,就像你在一个答案下面的评论中所说的那样。还有什么其他的方法可以让解决方案对您有效吗?我读到了一张包含内容的图片,所以这个文件不会缓存图片,这正是我想要的,所以你有什么建议给我吗?是的。使用imageWithContentsOfFile。那对我来说是个好办法。我已经在我的项目中放弃了整个图像加载,因此无法进一步帮助您。[UIImage ImageName]应该只用于小的UI元素。
image = [UIImage imageWithContentsOfFile: [[NSBundle mainBundle] pathForResource:imageName ofType:nil]];