ios内存优化(转载)
ios内存优化(转载)
Lambda8421 发表于3年前
ios内存优化(转载)
  • 发表于 3年前
  • 阅读 450
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

iOS内存优化

从原型到产品的阶段,我们总会遇到一些内存优化的问题。我的app运行很卡,然后我在instrument上查看对象的内存占用情况,当我加载 到UICollectionView容器时,发现在Allocations内存分配栏目,lifespan的created&still living栏目中有一项ImageIO_PNG_Data占用了100M以上的内存,但是显示的图片只有6张,真是太奇怪了。首先我怀疑,是图片没有压缩,然后我用原生的方法把图片压缩到512K以内,

+(NSData*)compressImage:(UIImage*)image{ CGFloat compression = 0.9f; CGFloat maxCompression = 0.1f; /** * 512kb */ int maxFileSize = 512*1024; NSData *imageData = UIImageJPEGRepresentation(image, compression); while ([imageData length] > maxFileSize && compression > maxCompression) { compression -= 0.1; imageData = UIImageJPEGRepresentation(image, compression); } return imageData; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+ ( NSData * ) compressImage : ( UIImage * ) image {
     CGFloat compression = 0.9f ;
     CGFloat maxCompression = 0.1f ;
     /**
     *  512kb
     */
     int maxFileSize = 512 * 1024 ;
     NSData *imageData = UIImageJPEGRepresentation ( image , compression ) ;
     while ( [ imageData length ] > maxFileSize && compression > maxCompression )
     {
         compression -= 0.1 ;
         imageData = UIImageJPEGRepresentation ( image , compression ) ;
     }
     return imageData ;
}

但是,问题貌似,还是没有解决。后来我终于发现,是UIImageJPEGRepresentation这个方法,让UIImage 与 NSdata相互转化的时候室是有损耗的,所以我们在NSCoding,序列化对象的时候选用NSData,而不是UIImage。经验,永远不要把 UIImage放在数组里,性能非常差,就算我把图片压缩得返回的是NSData,但是转化成UIImage并存到对象数组里面以后几乎等于没有压 缩!NSData系统默认就已经序列化(NSCoding协议),每次要用到UIImage就这样去调用[UIImage imageWithData:imageData]。这样做以后,就算有30张图片内存的占用也就十几兆的样子。

后来还有个笑话,当我在虚拟机上运行的时候,有个叫ImageIO_JPEG_Data的东西又占了很大的内存,看图

2014-08-23_19-47-27然后我开始调试,过了四个钟头,我满头大汗,在stackoverflow上也没找到答案,后来我在真记上测试,一切又正常了,WTF!不要相信虚拟机,Xcode对虚拟机和真机在内存分配上不是一回事…………

 

共有 人打赏支持
粉丝 10
博文 120
码字总数 121640
×
Lambda8421
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: