UIImageView *mooshinLogo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mooshin.png"]];
我不确定我是否正确实例化我的图像,因为我一直在阅读图像名称将不会从缓存中清空,只应用于按钮和小图标。背景图片和图片库怎么样?
如何以正确的方式实现UIImageView?
答案 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页时,我可以记住内存。