如此才能優化App性能 ?

App優化項目

一般針對項目優化的主要分爲以下幾個主要的方向:
1.移除項目中不需要的動態庫。
2.移除不需要的類,合併一類功能類似的類及類的擴展(前提是不在對這些類做大的變動以及處理),並做響應的區分邏輯處理。
3.壓縮資源圖片,刪除開發中不需要的資源圖片。
4.優化applicationWillFinishLaunching,減少在啓動的之間的這段時間做太多操作。

使用特殊的工具來進行無用類的篩選 fui (Find Unused Imports)

//安裝 fui 工具 在終端中執行命令
sudo gem install fui -n /usr/local/bin

fui usage: https://github.com/dblock/fui

到工程目錄下,執行 fui find 命令,可以找出所有的沒有用到的class文件

防止離屏渲染
1.圓角

imageView.layer.cornerRadius=CGFloat(10);
imageView.layer.masksToBounds=YES;

優化方案1:使用貝塞爾曲線UIBezierPath和Core Graphics框架畫出一個圓角

UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)]; 
imageView.image = [UIImage imageNamed:@"myImg"]; 
//開始對imageView進行畫圖 
UIGraphicsBeginImageContextWithOptions(imageView.bounds.size, NO, 1.0); 
//使用貝塞爾曲線畫出一個圓形圖 
[[UIBezierPath bezierPathWithRoundedRect:imageView.bounds cornerRadius:imageView.frame.size.width/2.0] addClip];
[imageView drawRect:imageView.bounds];
imageView.image = UIGraphicsGetImageFromCurrentImageContext(); 
//結束畫圖 
UIGraphicsEndImageContext();
[self.view addSubview:imageView];

優化方案2:使用CAShapeLayer和UIBezierPath設置圓角

UIImageView *imageView=[[UIImageView alloc]initWithFrame:CGRectMake(100,100,100,100)];
imageView.image=[UIImage imageNamed:@"myImg"];
UIBezierPath *maskPath=[UIBezierPath bezierPathWithRoundedRect:imageView.bounds byRoundingCorners:UIRectCornerAllCorners cornerRadii:imageView.bounds.size];
CAShapeLayer *maskLayer=[[CAShapeLayer alloc]init];
//設置大小
maskLayer.frame=imageView.bounds;
//設置圖形樣子
maskLayer.path=maskPath.CGPath;
imageView.layer.mask=maskLayer;
[self.view addSubview:imageView];

UITableView的優化

1.cell高度優化
如果是固定的行高就直接設置rowHeight,不要去重寫 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath因爲每次調用cell的方法時都會觸發此方法,因此沒有直接設置rowHeight效率高。
如果是動態高度需要設置一下預估高度。滿足下面三條:
* 使用Autolayout進行UI佈局約束(要求cell.contentView的四條邊都與內部元素有約束關係)。
* 指定TableView的estimatedRowHeight屬性的默認值,就是初始化的一個默認高度。
* 指定TableView的rowHeight屬性爲UITableViewAutomaticDimension。
設置爲:
self.myTableView.estimatedRowHeight = 44.0;
self.myTableView.rowHeight = UITableViewAutomaticDimension;
2.渲染
離屏渲染會付出很大的開銷,能避免離屏渲染儘量就不要離屏渲染。
下面的情況或操作會引發離屏渲染:
* 設置透明(alpha)屬性
* 爲圖層設置遮罩(layer.mask)
* 將圖層的layer.masksToBounds / view.clipsToBounds屬性設置爲true
* 將圖層layer.allowsGroupOpacity屬性設置爲YES和layer.opacity小於1.0
* 爲圖層設置陰影(layer.shadow *)。
* 爲圖層設置layer.shouldRasterize=true
* 具有layer.cornerRadius,layer.edgeAntialiasingMask,layer.allowsEdgeAntialiasing的圖層
* 文本(任何種類,包括UILabel,CATextLayer,Core Text等)使用CGContext在drawRect :方法中繪製大部分情況下會導致離屏渲染,甚至僅僅是一個空的實現
3.減少視圖的數目
4.減少多餘的繪製操作
5.不要給cell動態添加subView
6.滑動時按照需要加載對應的內容
7.圓角的優化等等
其他一些優化建議:
* 當我們需要圓角效果時,可以使用一張中間透明圖片蒙上去
* 使用ShadowPath指定layer陰影效果路徑
* 使用異步進行layer渲染(Facebook開源的異步繪製框架AsyncDisplayKit)
* 設置layer的opaque值爲YES,減少複雜圖層合成(如果opaque設置NO,那麼Alpha應該小於1)
* 儘量使用不包含透明(alpha)通道的圖片資源
* 儘量設置layer的大小值爲整形值
* 直接讓美工把圖片切成圓角進行顯示,這是效率最高的一種方案
* 很多情況下用戶上傳圖片進行顯示,可以讓服務端處理圓角
* 使用代碼手動生成圓角Image設置到要顯示的View上,利用UIBezierPath(CoreGraphics框架)畫出來圓角圖片

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章