UIImage imageNamed的释放问题

发布时间:2016-12-9 17:51:47 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"UIImage imageNamed的释放问题",主要涉及到UIImage imageNamed的释放问题方面的内容,对于UIImage imageNamed的释放问题感兴趣的同学可以参考一下。

为了方便,一开始读取图像资源的时候都是直接使用了[UIImage imageNamed:@""]方法,这个方法非常方便,一句话就可以从bundle中读取图片。 初步测试,功能一切正常。后来发现多次操作之后,应用经常发生内存警告从而导致自动退出的问题。定位之后发现是由于[UIImage imageNamed: @""]分配的图像都没有释放引起的。而之前从官方的reference中得到的信息应该是[UIImage imageNamed:@""]分配的图像系统会放到cache里面。而关于cache管理的规则就没有明确的介绍。由此看来[UIImage imageNamed:]只适合与UI界面中小的贴图的读取,而一些比较大的资源文件应该尽量避免使用这个接口。 最后通过直接读取文件路径[UIImage imageWithContentsOfFile]解决掉这个问题. 在重构代码时,认真处理一些内存未释放的问题。看到自已的目录树图标的加载,好象没有释放内存,于是,将下面的代码做修改: [cpp] view plaincopy if(isExpand)   {       cell.directoryAccessoryImageView.image = [UIImage imageNamed:@"TriangleSmall2.png"];   }   else   {       cell.directoryAccessoryImageView.image = [UIImage imageNamed:@"TriangleSmall.png"];   }   cell.imageView.image = [UIImage imageNamed:@"Folder.png"];   改成: [cpp] view plaincopy cell.directoryAccessoryImageView.image = [[UIImage imageNamed:@"TriangleSmall2.png"] autoRelease];   结果,产生内存访问错。 再改: [cpp] view plaincopy UIImage * img = [UIImage imageNamed:@"TriangleSmall2.png"];   cell.directoryAccessoryImageView.image = img;   img release];   同样报错。 查了资料,才知道自已认识上的错误: 1:对于类方法(静态方法)默认是autoRelease的。我添加的代码导致了过渡释放。所有类方法都会这样吗?我不能确定。反正这里是。 有人说:类方法创建的会自动加入到自动释放池中。 2:对于imageNamed,系统有缓存的处理,相同图片在第二次使用,会使用缓存。 3:由于2,所以在加载图片时,如果是大图片,或者不重复出现的,不要使用 imageNamed来加载图片,以避免太多的内存消耗。

上一篇:JAVA经典面试题目
下一篇:grep用法

相关文章

相关评论