簡體   English   中英

iPhone App內存泄漏; Instruments和Clang找不到泄漏

[英]iPhone App is leaking memory; Instruments and Clang cannot find the leak

我已經開發了一種iPhone程序,它是一種圖像處理程序:

用戶獲得一個UIImagePickerController並選擇一個圖像。 然后,程序會在新線程中進行一些繁重的計算(以提高應用程序的響應能力)。 該線程當然具有其自己的自動釋放池。 計算完成后,單獨的線程會向主線程發出信號,告知可以顯示結果。 該應用程序將創建一個新的視圖控制器,並將其推入導航控制器。

簡而言之:

  1. UIImagePickerController
  2. 新線程(自動釋放池)對圖像數據進行了大量計算
  3. 向主線程發出已完成的信號
  4. 主線程創建視圖控制器並將其推入導航控制器
  5. 視圖控制器顯示圖像結果

我的程序運行良好,但是如果我通過點擊后退按鈕關閉導航控制器的頂視圖控制器,然后重復整個過程幾次,則我的應用程序將崩潰。 但是只能在設備上! 儀器找不到任何泄漏(除了一些我不負責的小泄漏:線程創建,NSCFString;總體大約10 kB)。 甚至Clang靜態分析器也告訴我,我的代碼似乎還不錯。

我知道UIImage類可以緩存從便利方法返回的圖像和對象,除非它們的自動釋放池耗盡了它們。 但是大多數時候,我使用CGImageRef並使用UIImage的alloc,init和release方法來盡快釋放內存。

目前,我不知道如何解決問題。 您將如何解決這個問題?

Crash Log:

Incident Identifier: F4C202C9-1338-48FC-80AD-46248E6C7154
CrashReporter Key:   bb6f526d8b9bb680f25ea8e93bb071566ccf1776
OS Version:          iPhone OS 3.1.1 (7C145)
Date:                2009-09-26 14:18:57 +0200

Free pages:        372
Wired pages:       7754
Purgeable pages:   0
Largest process:   _MY_APP_

Processes
         Name                 UUID                    Count resident pages
        _MY_APP_ <032690e5a9b396058418d183480a9ab3>   17766 (jettisoned) (active)
     debugserver <ec29691560aa0e2994f82f822181bffd>     107
    syslog_relay <21e13fa2b777218bdb93982e23fb65d3>      62
notification_pro <8a7725017106a28b545fd13ed58bf98c>      64
notification_pro <8a7725017106a28b545fd13ed58bf98c>      64
            afcd <98b45027fbb1350977bf1ca313dee527>      65
    mediaserverd <eb8fe997a752407bea573cd3adf568d3>     319
            ptpd <b17af9cf6c4ad16a557d6377378e8a1e>     142
         syslogd <ec8a5bc4483638539fa1266363dee8b8>      68
        BTServer <1bb74831f93b1d07c48fb46cc31c15da>     119
            apsd <a639ba83e666cc1d539223923ce59581>     165
         notifyd <2ed3a1166da84d8d8868e64d549cae9d>     101
      CommCenter <f4239480a623fb1c35fa6c725f75b166>     161
     SpringBoard <8919df8091fdfab94d9ae05f513c0ce5>    2681 (active)
      accessoryd <b66bcf6e77c3ee740c6a017f54226200>      90
         configd <41e9d763e71dc0eda19b0afec1daee1d>     275
       fairplayd <cdce5393153c3d69d23c05de1d492bd4>     108
   mDNSResponder <f3ef7a6b24d4f203ed147f476385ec53>     103
       lockdownd <6543492543ad16ff0707a46e512944ff>     297
         launchd <73ce695fee09fc37dd70b1378af1c818>      71

**End**

您是否正在捕獲和處理內存警告? 您的代碼可能只是占用了過多的內存。 嘗試在視圖控制器中使用-(void)didReceiveMemoryWarning方法,以查看是否被調用。

這種行為將與您看到的一致,因為iPhone設備的內存量非常有限,但是iPhone模擬器僅受計算機內存的限制。

我注釋掉了幾行,並圍繞某些代碼片段構建了一些沉重的for循環,以隔離並發現問題。 原來,我已經用一種較小的方法刪除了一行,該行應該在計算后清除:

CGImageRelease(result);

因此,當生成新圖像時,舊結果被泄漏了。

我不知道為什么Clang或Instuments找不到此泄漏。 但是,謝謝您的幫助!

“泄漏”是指儀器泄漏工具嗎? 那可能不會“看到”您的CG調用消耗的內存為泄漏,因為它們已被分配。

使用ObjectAlloc會好很多倍,並查看在短時間內保留了哪些內存(拖動時間線並按住選項可以查看一小段時間)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM