2009-09-26 62 views
0

我開發了一種iPhone程序,它是一種圖像處理程序:iPhone App正在泄漏內存;儀器和鏗鏘無法找到泄漏

用戶得到一個UIImagePickerController並選擇一個圖像。然後程序在一個新的線程中進行一些繁重的計算(用於應用程序的響應)。線程當然有自己的autorelease池。計算完成後,分離的線程會向主線程發出信號,表示結果可以呈現。該應用程序創建一個新的視圖控制器,將其推到導航控制器上。

簡而言之:

  1. 的UIImagePickerController
  2. 新線程(自動釋放池)做一些重計算與圖像數據
  3. 信號到主線程,它的完成
  4. 主線程創建視圖控制器和推它到導航控制器上
  5. 視圖控制器呈現圖像結果

我的程序運行良好,但如果通過點擊後退按鈕並重復整個過程幾次,導致導航控制器的頂視圖控制器關閉,我的應用程序崩潰。但只在設備上! 儀器找不到任何泄漏(除了一些次要的漏洞,我不認爲它們負責:線程創建,NSCFString;整體大約10 kB)。即使鏗鏘靜態分析儀告訴我,我的代碼似乎是好的。

我知道UIImage類可以緩存圖像和從便利方法返回的對象得到釋放只有當他們的自動釋放池被耗盡。但大部分時間我都用CGImageRef和我使用'alloc,init &釋放方法儘快釋放內存。

目前,我不知道如何隔離問題。你會如何解決這個問題?

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** 
+0

你是否在主線程上執行所有CGImage調用? – 5ound

回答

0

您是否在捕捉和處理內存警告?你的代碼可能只是使用了太多的內存。嘗試在視圖控制器中使用-(void)didReceiveMemoryWarning方法來查看它是否被調用。

此行爲將與您所看到的一致,因爲iPhone設備的內存量非常有限,但iPhone模擬器僅受限於計算機中的RAM。

+0

是的,我正在迴應這個警告。我的實現釋放了當前所有不必要的內存,如視圖控制器。 – Norbert

+0

但你是否也稱爲「超級」實施? 另外,你是否正確處理viewDidUnload? –

0

我註釋掉了一些行,並且圍繞某些代碼段構建了一些重循環來隔離和發現問題。原來,我已刪除了其本來的計算後,清理小法的行:

CGImageRelease(result); 

於是產生了新的圖像時,舊的結果得到了泄露。

我想知道爲什麼Clang或Instuments沒有發現這種泄漏。但感謝您的幫助!

0

通過「泄漏」,你的意思是儀器泄漏工具?這可能不會「看到」你的CG電話所消耗的內存是因爲它們是混合的而泄漏的......

使用ObjectAlloc,您可以更好地使用ObjectAlloc,並在短時間內查看內存在哪裏(通過拖動時間線拖動以查看一小段時間)。

+0

啊,很高興知道! 我用過ObjectAlloc,但總體生活字節總是在2MB以下。 – Norbert