使用UIImageView而不是记忆猪?

时间:2011-08-25 18:52:15

标签: iphone ios cocoa-touch

UIImageView *mooshinLogo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mooshin.png"]];

我不确定我是否正确实例化我的图像,因为我一直在阅读图像名称将不会从缓存中清空,只应用于按钮和小图标。背景图片和图片库怎么样?

如何以正确的方式实现UIImageView?

4 个答案:

答案 0 :(得分:2)

imageNamed:方法缓存您加载的图像。如果内存不足或内存警告,缓存将被清空。

如果您想在图库中显示图片,最好使用imageWithContentsOfFile:方法,因为它不会缓存数据。

如果图片非常大,您应该使用CATiledLayer来使用图块显示图片。

答案 1 :(得分:0)

不用担心!方法imageNamed返回一个自动释放的对象,当你不再需要它时,它将执行你所谓的“从缓存中清空”(即它的内存将被释放)。

答案 2 :(得分:0)

[UIImage imageNamed:(NSString *)imageName]是一个自动释放的便利构造函数。这意味着它在初始化时保留计数增加,在runloop结束时减少。你可以制造100个它们,几秒钟后它们会从记忆中消失,除非它们被别的东西保留下来。通过将它传递给UIImageView,UIImageView将保留它并且它将保留在内存中直到UIImageView完成它,所以你正确地这样做,除非你指的是在“非活动”中缓存图像的操作系统内存。它可以在幕后完成(并且会知道何时摆脱它),但你肯定正确地处理了对象的生命周期。由于您使用[[Class alloc] init ...]方式构建UIImageView,请确保稍后调用[mooshinLogo release]或[mooshinLogo autorelease]。

(如果您已经知道,请忽略这一点。)Objective-C(至少对于iOS开发而言)是一种引用计数语言。从分配时起,所有对象的引用计数或保留计数均为1。从那里,它们可以保留([id retain]),释放([id release]),或标记为在runloop([id autorelease])结束时释放。一旦计数为零,它们将被释放,但你永远不应该关注它的实际保留计数,只使用你拥有(或保留)的对象。

如有疑问,可以查看Clang的静态分析仪。它发现可能有75%的泄漏,我只有少数误报。 Build&分析,或Cmd + Shift + B.

答案 3 :(得分:0)

上面的其他人是关于imageNamed保持这些图像的缓存。使用NIB文件时尤其如此。使用ImageViews释放ViewController不会直接释放相关图像。

我的应用程序在导航控制器中有很多带有大量页面的图像。最终只使用imageNamed方法会崩溃。所以,我现在使用(在这里找到SO)和结束:

+ (UIImage *)imageNamed:(NSString *)name {
    //NSLog(@"ImageNamed: %@", name);
    return [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:name ofType:nil]];
}

现在我可以控制何时删除图像并使其从内存中清除。上面提到的应用程序,我实际上会在viewDidLoad上加载图像并在viewDidDisappear上删除它们。所以,当我在NavController中深度为10-15页时,我可以记住内存。