Разработих програма за iPhone, която е нещо като програма за манипулиране на изображения:
Потребителят получава UIImagePickerController и избира изображение. След това програмата прави някои тежки изчисления в нова нишка (за отзивчивост на приложението). Нишката има, разбира се, собствен пул за автоматично освобождаване. Когато изчислението е направено, отделената нишка сигнализира на основната нишка, че резултатът може да бъде представен. Приложението създава нов контролер за изглед и го поставя в контролера за навигация.
Накратко:
- 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**