<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                [toc] ## 前言 根據內存區塊的引用狀態劃分內存: - `緩存內存(Cached memory)` - `泄漏內存(Leaked memory)` - `廢棄內存(Abandoned memory)` - `僵尸內存(Zombies memory)` `緩存內存`:正常使用的內存 `泄漏內存`:`沒有引用也沒有被釋放的內存`。可以用`leaks`檢測到,MRC常見,ARC多為Core相關庫未release導致 `廢棄內存`:`內存仍存在引用,但是無法被使用到`。無法用leaks檢測到,可嘗試使用`Allocations`排查,一般為`循環引用導致` ## 一、內存分類 根據`內存區塊`的引用狀態,可以把內存分為緩存內存(Cached memory)、泄漏內存(Leaked memory)、廢棄內存(Abandoned memory)和僵尸內存(Zombies memory),其中`泄漏內存`和`廢棄內存`為`內存增長`的主要原因,`僵尸內存`的使用會導致程序的`crash` >Cached memory: Memory still referenced by your application that might be used again for better performance. > >Leaked memory: Memory unreferenced by your application that cannot be used again or freed (also detectable by using the Leaks instrument). > >Abandoned memory: Memory still referenced by your application that has no useful purpose. Zombies: objects that are called after they’ve been released and no longer exist `1.泄漏內存`:內存沒有被釋放,也沒有對應的引用,可以被Leaks工具檢測到。 常見情形:MRC中Retain沒有對應的Release,ARC中一般出現這種情況多為`c相關對象`未調用相對應的`release`方法 ```objectivec 示例1: NSString * testStr = (__bridge NSString *)(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,(CFStringRef)[NSString stringWithFormat:@"%@",self],NULL,CFSTR("!*'();:@&=+$,/?%#[]"),kCFStringEncodingUTF8)); // CFRelease(testStr); 示例2: CGImageRef imageRef = CGImageCreateWithImageInRect([[UIImage imageNamed:@"xxx"] CGImage], CGRectZero); // CFRelease(imageRef); ``` `2.廢棄內存`:`內存沒有有效的引用,無法被程序使用`,無法用Leaks檢測到,可以通過Allocations分析出 常見情形:主要為循環引用和常駐對象強持有,如delegate聲明為強引用,屬性block強持有外部變量導致的循環引用,NSTimer未及時釋放等 ```objectivec 實例1: self.callback = ^ { NSLog("%@",self); } 實例2: self.timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(task) userInfo:nil repeats:YES]; // [self.timer invalidate]; // 需要注意的是如果對象由于Timer被runloop強引用時,在該對象的dealloc中是停止定時器是不生效的,因為由于強引用導致該對象不會被釋放,dealloc便不會被調用 ``` `3.僵尸內存`:`對象內存已經被釋放,仍存在對應的引用指向該部分區域`。通過引用使用該部分區域可能會造成`EXC_BAD_ACCESS`異常 常見情形:已經釋放的對象執行release或收到其他的調用;對象創建后沒有被強引用卻被使用 ## 二、內存泄漏排查 **1.1 靜態分析** 通過`Xcode Analyze`功能靜態分析代碼,選中Xcode工程菜單 `Product - Analyze`,靜態分析可以分析出程序無用變量,無法執行到的分支,廢棄接口,靜態內存泄漏等 >注:cocoapods debug切換到release需要使用pod install,否則有可能無法生成release.xcconfig ![](https://img.kancloud.cn/53/0e/530e46166ca482e72e3383a78b2b01e9_1200x884.png) **1.2 Runtime分析 Leaks&Allocations** 通過Xcode `Leak`工具運行時分析代碼 Xcode選中`Product - Profile`,以Profile方式安裝程序到真機,打開Instruments中的Leaks,選中左上角的錄制按鈕,選中對應程序開始執行分析 **常用設置:** `Call Tree`:調用棧方式查看泄漏來源 `Invert Call Tree`:反轉調用堆棧,可以直接把泄漏的調用處顯示在最頂層 `Hide System Libraries`:隱藏系統庫相關符號,由于沒有符號化信息,建議隱藏 `Automatic Snapshotting`:自動掃描,掃描一次耗時較大,大客戶端建議關閉自動掃描或者增加掃描間隔,或使用手動進行snapshot,否則可能會卡頓和程序異常退出 `Snapshot Now`:立馬掃描生成一次內存快照 ![](https://img.kancloud.cn/09/e6/09e6915e573033c0650330747458affa_1200x503.png) ------------- ![](https://img.kancloud.cn/58/ab/58ab9549b8281632331bf908c4222db6_1200x547.png) ---------- ![](https://img.kancloud.cn/58/ab/58ab9549b8281632331bf908c4222db6_1200x547.png)) >注:如果無法顯示符號化后的堆棧信息,需要查看工程配置中是否在Release下生成對應的dsym ![](https://img.kancloud.cn/3a/b8/3ab833041354e50e29d8882bcdb9e591_1200x418.png)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看