[英]iPhone App is leaking memory; Instruments and Clang cannot find the leak
我已經開發了一種iPhone程序,它是一種圖像處理程序:
用戶獲得一個UIImagePickerController並選擇一個圖像。 然后,程序會在新線程中進行一些繁重的計算(以提高應用程序的響應能力)。 該線程當然具有其自己的自動釋放池。 計算完成后,單獨的線程會向主線程發出信號,告知可以顯示結果。 該應用程序將創建一個新的視圖控制器,並將其推入導航控制器。
簡而言之:
我的程序運行良好,但是如果我通過點擊后退按鈕關閉導航控制器的頂視圖控制器,然后重復整個過程幾次,則我的應用程序將崩潰。 但是只能在設備上! 儀器找不到任何泄漏(除了一些我不負責的小泄漏:線程創建,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.