經過靜態 Analyze 工具,以及運行時 Profile 工具分析性能瓶頸,並進行性能優化。結合本人在開發中遇到的問題,能夠從如下幾個方面進行性能優化。緩存
一、不透明的View 設置爲opaque。性能優化
二、根據實際狀況重用、延遲加載或預加載View。服務器
三、減小subviews數量,定製複雜cell使用drawRect。儘可能使用drawRect而不是layoutSubView。函數
四、不直接調用drawRect、 layoutSubviews方法。萬不得已時能夠用替代方法: setNeedsDisplayInRect,layoutIfNeeded,替代方法也儘可能不要調用,經過合理的代碼結構解決重佈局問題,儘可能一次完成佈局。工具
一、正確使用‘reuseIdentifier’重用cell。佈局
二、儘可能使全部的view opaque。post
三、減小subviews數量,定製複雜cell使用drawRect。性能
四、儘可能不調用‘cellForRowAtIndexPath’。調用cellForRowAtIndexPath會致使cell緩存失效優化
五、cache儘量多的東西,包括行高。ui
一、緩存不大可能改變可是須要常常讀取的東西。遠端服務器的響應、圖片、計算結果。
二、重用大開銷對象。對於初始化很慢的對象經過添加屬性的方式保持該對象,保證只被初始化一次,屢次複用。如NSDataFormatter。
三、方法指針緩存。若是一個方法在一個循環次數很是多的循環中使用,在進入循環前使用methodForSelector獲取該方法的IMP,在循環體中直接調用該IMP。
一、 耗時操做使用子線程進行,或者放入任務隊列中。
二、同步使用串行隊列代替同步鎖。
三、不重要的任務放在idle中運行
- (void)idleNotificationMethod { // do something here } - (void)registerForIdleNotification { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(idleNotificationMethod) name:@"IdleNotification" object:nil]; NSNotification *notification = [NSNotification notificationWithName:@"IdleNotification" object:nil]; [[NSNotificationQueue defaultQueue] enqueueNotification:notification postingStyle:NSPostWhenIdle]; }
使用autorelease pool 下降內存峯值
一、不在viewWillApear中進行費時操做
二、若是關鍵代碼用C/C++效率更高就使用C/C++
對圖片數據進行decode。在子線程中設置image的大小後,在imageview中使用縮放後的image。緣由:因爲UIImage的imageWithData函數是每次畫圖的時候纔將Data解壓成ARGB的圖像,因此在每次畫圖的時候,會有一個解壓操做,UIImage初始化後僅僅是把圖片加載到內存中,而實際的解碼和重採樣是在圖片須要顯示時才進行。
//圖片重採樣,在子線程中進行 CGSize itemSize = CGSizeMake(width, height);//實際要縮放的大小 UIGraphicsBeginImageContext(itemSize); CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height); [image drawInRect:imageRect]; UIImage newImage = UIGraphicsGetImageFromCurrentImageContext(); //重採樣後的圖片 UIGraphicsEndImageContext();