內(nèi)存分析(Analyze)

一. 靜態(tài)內(nèi)存分析

  1. 所謂靜態(tài)內(nèi)存分析, 是指在程序沒運(yùn)行的時(shí)候, 通過工具對(duì)代碼直接進(jìn)行分析

    • 根據(jù)代碼的上下文的語法結(jié)構(gòu), 讓編譯器分析內(nèi)存情況, 檢查是否有內(nèi)存泄露
  2. 作用

    • 邏輯錯(cuò)誤: 訪問未初始化的變量或者野指針
    • 聲明錯(cuò)誤: 聲明了一個(gè)對(duì)象, 但是從未使用過
    • 內(nèi)存管理錯(cuò)誤: 內(nèi)存泄露
    • 缺點(diǎn): 靜態(tài)內(nèi)存分析由于是編譯器根據(jù)代碼進(jìn)行的判斷, 做出的判斷不一定會(huì)準(zhǔn)確, 因此如果遇到提示, 應(yīng)該去結(jié)合代碼上文檢查一下
  3. OC中的靜態(tài)內(nèi)存分析:

    • 曾經(jīng)在MRC環(huán)境下, OC的代碼需要手動(dòng)管理內(nèi)存, 任何對(duì)象的引用, 都要伴隨一次release操作, 否則很容易發(fā)生內(nèi)存泄露, 因此在MRC環(huán)境下, 使用靜態(tài)內(nèi)存分析很有必要
    • 而在目前的ARC環(huán)境下, 很少會(huì)發(fā)生內(nèi)存泄露, 但是也會(huì)有很少數(shù)的情況導(dǎo)致內(nèi)存泄露
      • 如Foundation對(duì)象與CoreFoundation對(duì)象的相互轉(zhuǎn)化, CoreFoundation對(duì)象享用ARC機(jī)制, 所以容易發(fā)生內(nèi)存泄露
  4. Swift的靜態(tài)內(nèi)存分析

    • Swift中, 使用了類型重映射機(jī)制, 他可以將對(duì)象轉(zhuǎn)換成能夠自動(dòng)管理內(nèi)存的對(duì)象, 不需要我們手動(dòng)釋放, 因此Swift在內(nèi)存管理方面更為安全

二. 內(nèi)存分配

  1. 作用

    • 查看當(dāng)前運(yùn)行情況的內(nèi)存分配
    • 查看使用過的內(nèi)存有沒有釋放掉
  2. 關(guān)于App中加載圖片的注意點(diǎn)

    • -imageNamed:

      • 該方法用于加載小圖片/使用頻率高的圖片

      • 此方法加載過得圖片, 在App運(yùn)行期間, 始終會(huì)保有緩存, 這個(gè)緩存是由系統(tǒng)管理的, 無法通過代碼銷毀緩存

      • 當(dāng)系統(tǒng)察覺到內(nèi)存消耗過高, 就會(huì)自動(dòng)釋放這部分內(nèi)存

          Search for an object whose name was set explicitly using the setName: method and currently resides in the image cache.
          該方法首先會(huì)從圖片內(nèi)存中查找
          Search the app's main bundle for a file whose name matches the specified string. 
          如果沒有找到, 就在App的mainBundle中查找
          Search the Application Kit framework for a shared image with the specified name.
          如果bundle中也沒有, 就會(huì)去framework的庫中尋找
        
    • -imageWithContentsOfFile:

      • 該方法用于加載大圖片/使用率較低的圖片
      • 它只是加載一次圖片, 并且不會(huì)做緩存, 當(dāng)對(duì)象釋放的時(shí)候, 內(nèi)存也就被釋放掉了
      • 因此對(duì)于不常用的圖片應(yīng)該使用這個(gè)方法
  3. 圖片在沙盒中的存在形式

    1. 如果當(dāng)前項(xiàng)目部署版本 <= 6.x: 那么所有圖片就會(huì)直接暴露在沙盒的資源包中(main bundle), 不會(huì)進(jìn)行壓縮為Assets.car文件
    2. 如果當(dāng)前項(xiàng)目部署版本 >= 7.x
      • 放在Images.xcassets中的所有圖片, 都會(huì)被壓縮為Assets.car文件, 不會(huì)直接暴露在沙盒的資源包中
      • 而沒有放在Images.xcassets的圖片, 會(huì)直接暴露在沙盒的資源包中
    3. 使用對(duì)比
      • 壓縮為Assets.car的文件:
        • 這些圖片不會(huì)暴露在外, 但是無法或得到這些圖片的路徑, 只能通過圖片名-imageName來加載圖片, 并且會(huì)產(chǎn)生緩存
        • 小圖片/使用頻率高, 放在image.xcassets中
      • 未壓縮的圖片:
        • 圖片暴露在外, 可以通過imageWithContentOfFile來獲得圖片的路徑, 不會(huì)有緩存
        • 大圖片/使用頻率低, 如新特性界面, 放在外面
  4. 補(bǔ)充一個(gè)獲取car中圖片的方法

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容