iOS--表格性能優化--部分

表格性能優化--部分

時間:2017-1-16

Demo下載地址

  1. xcode 查找快捷鍵:command + shift + o
  2. 進入到當前這個文件:command + shift + j
  3. 選擇替換:commadn+shift+e

Xcode經常使用功能和快捷鍵

Command+[ -> 代碼塊左移ios

Comamnd+] -> 代碼塊右移git

Tab -> 接受代碼自動完成提示github

Esc -> 顯示代碼提示web

Command+B -> 編譯數組

Command+R -> 運行xcode

Control+F -> 前移光標緩存

Control+B -> 後移光標安全

Control+P -> 光標移到上一行性能優化

Control+N -> 光標移到下一行架構

Control+A -> 光標移到行首

Control+E -> 光標移到行尾

Control+T -> 交換光標左右字符

Control+D -> 刪除光標右邊的字符

Control+K -> 刪除本行

Control+L -> 將光標所在位置置於窗口中央

按住Option雙擊鼠標 -> 搜索文檔

Command+Y -> 激活/禁用斷電

Command+Control+Y -> 繼續運行

F6 -> 單步跳過

F7 -> 單步跳入

F8 -> 跳出

Cocoa Touch 框架:


Cocoa Touch Layer
Media Layer
Core Services Layer
Core OS Layer
  • 從上到下依次爲Cocoa Touch、Media、Core Services、Core OS。

    Cocoa Touch層:包含建立iOS應用程序所需的關鍵框架。上至實現應用程序可視界面,下至與高級系統服務交互,都須要該層技術提供底層基礎。基本系統服務和關鍵框架(Address Book UI、UIKit等)UIKit Framework

  • Media層:包含圖形技術、音頻技術和視頻技術,這些技術相互結合就可爲移動設備帶來最好的多媒體體驗,更重要的是,它們讓建立外觀音效俱佳的應用程序變得更加容易。Core Graphics Framework,Core Animation Framewrok,AV Foundation Framework

  • Core Services層:爲全部的應用程序提供基礎系統服務。可能應用程序並不直接使用這些服務,但它們是系統不少部分賴以建構的基礎。Core Data Framewrok, Core Foundation Framework,Foundation Framework

  • Core OS層:Core OS層的底層功能是不少其餘技術的構建基礎。一般狀況下,這些功能不會直接應用於應用程序,而是應用於其餘框架。可是,在直接處理安全事務或和某個外設通訊的時候,必需要應用到該層的框架。
    Accelerate Framework,System Framework
    ---

SDWebImage Gif處理利用ImageIO的函數

內存問題:內存釋放不會當即執行,播放動圖,可是會佔用大量的內存

解決辦法:

1.開啓一個時間,CADisplayLink(每次屏幕屏幕都會觸發)
2.每次觸發,遞增index只加載一幀,以前的圖像當即釋放

YY_WebImage 若是要顯示動圖,須要使用YYAnimatedImageView
利用KVC修改imageView的類型
[self setValue:[[YYAnimatedImageView alloc] init] forKey:@"imageView"]

CGImageSourceRef source = CGImageSourceCreateWithData((__bridge CFDataRef)data, NULL);
    //獲取到gif動圖的幀數
    size_t count = CGImageSourceGetCount(source);

    UIImage *animatedImage;
    //判斷圖片數量,若是是1,直接返回靜態圖像
    if (count <= 1) {
        animatedImage = [[UIImage alloc] initWithData:data];
    }
    else {
         //建立圖像數據:真正消耗性能的根源
        NSMutableArray *images = [NSMutableArray array];

        NSTimeInterval duration = 0.0f;

        for (size_t i = 0; i < count; i++) {
             //取出第i幀
            CGImageRef image = CGImageSourceCreateImageAtIndex(source, i, NULL);
                //累加時長
            duration += [self sd_frameDurationAtIndex:i source:source];
                //把圖像添加到數據
            [images addObject:[UIImage imageWithCGImage:image scale:[UIScreen mainScreen].scale orientation:UIImageOrientationUp]];
                //釋放圖像
            CGImageRelease(image);
        }

        if (!duration) {
            duration = (1.0f / 10.0f) * count;
        }
         //設置動圖數組
        animatedImage = [UIImage animatedImageWithImages:images duration:duration];
    }

    CFRelease(source);

    return animatedImage;

表格性能測試,必定要在真機上運行,真機的內存比模擬器小不少,CPU架構和模擬器徹底不同

模擬器:Color Offscreen-Rendered離屏幕渲染

Debug Options:

  • Color Blended Layers 混合圖層
  • Color Hits Green and Misses Red
  • Color Copied Images
  • Color Immediately
  • Color Misaligned Images 圖像拉伸的
  • Color Offscreen_rendered Yellow 離屏幕渲染
  • Color Compositing Fast-Path Blue
  • Flash Updated Regions

iOS Core Animation Advanced Techniques(中文).pdf中有三個重點須要看:性能調優、高效繪圖、圖層性能

Cell表格性能優化:

  • 行高必定要緩存
  • 不要動態建立子視圖
    • 全部的子視圖都要預先建立
    • 若是不須要顯示能夠設置hidden
  • 全部的子視圖都應該添加到contentView
  • 全部的子視圖都必須指定背景顏色
  • 全部的顏色都不要使用alpha
  • cell柵格化
  • 異步繪製
//1.柵格化,美工術語:將cell中的全部內容,生成一張獨立的圖像,在屏幕滾動時,只顯示圖像
self.layer.shouldRasterize = YES;
//1.1 柵格化,必須指定分辨率,不然默認使用*1,生成圖像
self.layer.rasterizationScale = [UIScreen mainScreen].scale;
        
//2. 異步繪製:若是cell比較複雜,可使用 self.layer.drawsAsynchronously = YES;

你是怎麼測試性能的呢?使用單元測試
對UI測試可使用猴子測試

AFN

1.圖片太大,有可能不會緩存

2.使用的是系統默認的緩存

提問:若是使用SDWebImage加載圖像,會顯示指示器嗎?

答:這個跟AFNetworking沒有關係,不會顯示指示器

🐼🐶🐶若是對你有幫助,或以爲能夠。請右上角star一下,這是對我一種鼓勵,讓我知道我寫的東西有人承認,我纔會後續不斷的進行完善。

有任何問題或建議請及時issues me,以便我能更快的進行更新修復。

Email: marlonxlj@163.com

相關文章
相關標籤/搜索