文档章节

ios内存优化(转载)

Lambda8421
 Lambda8421
发布于 2015/02/28 10:46
字数 509
阅读 510
收藏 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对虚拟机和真机在内存分配上不是一回事…………

 

本文转载自:http://www.hlyu.cn/?p=177

共有 人打赏支持
Lambda8421
粉丝 10
博文 121
码字总数 121640
作品 0
闸北
程序员
私信 提问
Xcode的Architectures和Valid Architectures的区别,以及st...

作者:shede333 主页:http://my.oschina.net/shede333 版权声明:原创文章,版权声明:自由转载-非商用-非衍生-保持署名 [Creative Commons BY-NC-ND 3.0][] --- [Creative Commons BY-NC-...

shede333
2013/10/29
0
1
cocos2d-x与ios内存管理分析(在游戏中减少内存压力)

Cocos2d-x与ios内存管理分析(在游戏中减少内存压力) 猴子原创,欢迎转载。转载请注明: 转载自Cocos2D开发网--Cocos2Dev.com,谢谢! 年 原文地址: http://www.cocos2dev.com/?p=281 注:自己...

智捷课堂
2015/08/13
0
0
iOS涂色涂鸦效果、Swift仿喜马拉雅FM、抽屉转场动画、拖拽头像、标签选择器等源码

iOS精选源码 LeeTagView 标签选择控件(http://www.code4app.com/thread-31033-1-1.html) 为您的用户显示界面添加美观的加载视图(http://www.code4app.com/thread-31038-1-1.html) Swift4: 可......

sunnyaigd
09/19
0
0
iOS与JS交互之WKWebView-WKScriptMessageHandler协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「WKWebView与JS交互」「WKJSMessageHandler」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),J...

QiShare
09/02
0
0
阿里潘多拉实验室成功越狱 iOS 12 系统

雷锋网(公众号:雷锋网)消息,9月18日凌晨,Apple(苹果)正式对外发布最新的 iOS 12系统,几小时后,其安全防护系统很快就被阿里安全潘多拉实验室安全专家攻破,成为全球首个完成 iOS 12 完...

郭佳
09/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Node 框架接入 ELK 实践总结

我们都有过上机器查日志的经历,当集群数量增多的时候,这种原始的操作带来的低效率不仅给我们定位现网问题带来极大的挑战,同时,我们也无法对我们服务框架的各项指标进行有效的量化诊断,更...

嫣然丫丫丫
32分钟前
1
0
PostgreSQL 调用 Rust 函数内存耗用研究

开始看 PostgreSQL 的文档,以为对于那些 .so 形式的二进制扩展函数,比如用 C 语言编写的、Rust 编写的等,PG 会把它们装载到每个连接的内存里去。 因为 Rust 现在编译出来的二进制文件还比...

helloclia
32分钟前
2
0
HTTP Authorization Base64 验证

import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.nio.charset.Charset;import java.util.B......

laolin23
33分钟前
1
0
Spring Cloud Finchley.SR1 的学习与应用 7 - 服务容错保护 Hystrix

Hystrix 分布式系统中经常会出现某个基础服务不可用造成整个系统不可用的情况,这种现象被称为服务雪崩效应。为了应对服务雪崩,一种常见的做法是手动服务降级。而 Hystrix 的出现,给我们提...

张shieppp
36分钟前
2
0
PHP利用多进程处理任务(一篇写得比较容易理解的多进程文章)

 PHP多进程一般应用在PHP_CLI命令行中执行php脚本,不要在web访问时使用。   多进程处理分解任务一般要比单进程更快。 php查看是否安装多进程模块: php -m | grep pcntl (pcntl是proce...

hansonwong
37分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部