万恶的imageNamed

万恶的imageNamed,第1张

概述前段时间完成的一个iPad应用,近来测试发现一个问题,在iPad运行大量其他应用程序时很容易出现内容警告而导致程序退出。找了一些资料,发现用起来方便的+ (UIImage *)imageNamed:(NSString *)name,却存在一个很严重的内存释放问题,它所占用的内容不被释放,即使其所在的view已经release了。看完之后一阵后怕,皆因程序中使用UIImage基本都是使用这种方法获取

前段时间完成的一个iPad应用,近来测试发现一个问题,在iPad运行大量其他应用程序时很容易出现内容警告而导致程序退出。找了一些资料,发现用起来方便的+ (UIImage *)imagenamed:(Nsstring *)name,却存在一个很严重的内存释放问题,它所占用的内容不被释放,即使其所在的vIEw已经release了。看完之后一阵后怕,皆因程序中使用UIImage基本都是使用这种方法获取。事不宜迟,马上对代码进行优化。由于手头暂时没有设备测试,测试效果稍候再分析。

转载一篇很好的文章:


+ (UIImage *)imagenamed:(Nsstring *)name导致的内存问题

这种方法在application bundle的顶层文件夹寻找名字的图象,如果找到图片, 系统缓存图象。图片内容被加载到系统内存中,使用时直接引用到系统内存。  所以当图片比较大时,程序使用的内存会迅速上升导致内存警告并退出。  特别在使用Interface Builder建立界面时,如果直接拖动UIImageVIEw 并设置image的图片名称。InterfaceBuilder 正是通过UIImage 类的imagename方法加载图片。图片被缓存,导致内存使用较大。且无法释放,即使release掉 UIImageVIEw也无济于事。  所以推荐使用+ (UIImage *)imageWithContentsOffile:(Nsstring *)path方法加载图片。  也可以重载 imagenamed方法。  @implementation UIImage(imagenamed_Hack)  + (UIImage *)imagenamed:(Nsstring *)name {  return [UIImage imageWithContentsOffile:[Nsstring stringWithFormat:@"%@/%@",[[NSBundle mainBundle] bundlePath],name ] ]; }  @end  Note: With this overrIDe you will not have any cache loading UIImages,if you need this,  you will have to implement your own cache.  Tip: If your applications use much image processing,consIDer to use de PhotoshopFramework  for iPhone. Check here: http://sourceforge.net/projects/photoshopframew/

总结

以上是内存溢出为你收集整理的万恶的imageNamed全部内容,希望文章能够帮你解决万恶的imageNamed所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1093719.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存