2009-09-26 61 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