ios內存優化(轉載)

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張圖片內存的佔用也就十幾兆的樣子。 app

後來還有個笑話,當我在虛擬機上運行的時候,有個叫ImageIO_JPEG_Data的東西又佔了很大的內存,看圖 性能

2014-08-23_19-47-27而後我開始調試,過了四個鐘頭,我滿頭大汗,在stackoverflow上也沒找到答案,後來我在真記上測試,一切又正常了,WTF!不要相信虛擬機,Xcode對虛擬機和真機在內存分配上不是一回事………… 測試

相關文章
相關標籤/搜索