前几天,项目的功能基本完成差不多的时候。用allocation检测了下内存运行状况,发现当tableView快速滚动,以及页面不断跳转时,cg-raster-data在不断猛增,甚至达到了100M之多,并且当我将app退回后台时,也仅仅只是稍微释放了一点。
为什么当加载停止后,内存没有下去呢。一开始认为,可能因为sdwebimage是会将图片下载后放进内存中一直保存至收到内存警告,或者主动清除才能释放掉。于是我在离开加载图片的页面时,做了清除缓存及disk的动作,但是仍旧没用。所以问题不是出在这里。[[SDImageCachesharedImageCache]clearMemory];[[SDImageCachesharedImageCache]clearDisk];
然后我尝试了下将sd的最大下载内存占用设置了小一点。只要同一时间内,加载图片而多出来的内存不超过这个大小,是不是就会降低内存消耗呢。于是,我用setMaxMemoryCost 方法设置了最大内存。但是发现了另外个问题。因为sdwebimage同时能保存到内存的数量减少了,每次我下拉加载tableview时,会去从网络端不断的重新加载图片,导致页面每次reload时会闪屏。肉眼能明显的感觉的每次的闪动,用户体验特别差。
之后,在一通google。发现一个别人的解决办法,很好用,同时也确实解决了我的问题。sdwebimage在加载图片的时候,默认是shouldDecompressImages=YES.也就是框架作者本意是为了让图片加载更块,所以会帮我把图片解压至内存中,尤其图片分辨率愈大,内存消耗越大。需要将其关闭。
[[SDImageCache sharedImageCache] setShouldDecompressImages:NO];[[SDWebImageDownloader sharedDownloader] setShouldDecompressImages:NO];
关闭后发现,其实加载时候并没有特别明显的感觉加载速度变慢了。并且内存消耗几乎没有。其实开发者也有在文件里写明。只是平时很少有人会去看。
* Decompressing images that are downloaded and cached can improve peformance but can consume lot of memory.
* Defaults to YES. Set this to NO if you are experiencing a crash due to excessive memory consumption.