我開發了一種iPhone程序,它是一種圖像處理程序:iPhone App正在泄漏內存;儀器和鏗鏘無法找到泄漏
用戶得到一個UIImagePickerController並選擇一個圖像。然後程序在一個新的線程中進行一些繁重的計算(用於應用程序的響應)。線程當然有自己的autorelease池。計算完成後,分離的線程會向主線程發出信號,表示結果可以呈現。該應用程序創建一個新的視圖控制器,將其推到導航控制器上。
簡而言之:
- 的UIImagePickerController
- 新線程(自動釋放池)做一些重計算與圖像數據
- 信號到主線程,它的完成
- 主線程創建視圖控制器和推它到導航控制器上
- 視圖控制器呈現圖像結果
我的程序運行良好,但如果通過點擊後退按鈕並重復整個過程幾次,導致導航控制器的頂視圖控制器關閉,我的應用程序崩潰。但只在設備上! 儀器找不到任何泄漏(除了一些次要的漏洞,我不認爲它們負責:線程創建,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**
你是否在主線程上執行所有CGImage調用? – 5ound