前段时间完成的一个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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)