從原型到產品的階段,咱們總會遇到一些內存優化的問題。個人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對虛擬機和真機在內存分配上不是一回事………… 測試