从原型到产品的阶段,咱们总会遇到一些内存优化的问题。个人app运行很卡,而后我在instrument上查看对象的内存占用状况,当我加载 到UICollectionView容器时,发如今Allocations内存分配栏目,lifespan的created&still living栏目中有一项ImageIO_PNG_Data占用了100M以上的内存,可是显示的图片只有6张,真是太奇怪了。首先我怀疑,是图片没有压缩,而后我用原生的方法把图片压缩到512K之内, 数组
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张图片内存的占用也就十几兆的样子。 app
后来还有个笑话,当我在虚拟机上运行的时候,有个叫ImageIO_JPEG_Data的东西又占了很大的内存,看图 性能
而后我开始调试,过了四个钟头,我满头大汗,在stackoverflow上也没找到答案,后来我在真记上测试,一切又正常了,WTF!不要相信虚拟机,Xcode对虚拟机和真机在内存分配上不是一回事………… 测试