首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iPhone应用程序正在泄漏内存;仪器和Clang无法找到泄漏

iPhone应用程序正在泄漏内存;仪器和Clang无法找到泄漏
EN

Stack Overflow用户
提问于 2009-09-26 13:18:38
回答 3查看 1K关注 0票数 0

我开发了一个iPhone程序,它是一种图像处理程序:

用户获得一个UIImagePickerController并选择一个图像。然后,该程序在一个新线程中进行一些繁重的计算(用于应用程序的响应性)。当然,线程有自己的自动释放池。在进行计算时,分离的线程向主线程发出可以显示结果的信号。该应用程序创建一个新的视图控制器,将其推送到导航控制器上。

简言之:

  1. UIImagePickerController
  2. new线程(自动释放池)使用图像数据
  3. 信号对主线程做了大量计算,
  4. 主线程创建视图控制器并将其推送到导航controller
  5. view控制器上,显示图像结果

我的程序运行良好,但如果我取消导航控制器的顶部视图控制器,点击后退按钮,并重复整个过程多次,我的应用程序崩溃。但只在设备上!工具找不到任何漏洞(除了一些我觉得不负责的次要漏洞:线程创建,NSCFString;总体上大约有10 kB)。即使是Clang静态分析器也告诉我,我的代码似乎没有问题。

我知道UIImage类可以缓存图像,从方便方法返回的对象只能释放,它们的自动释放池被耗尽。但是,大多数时候,我使用CGImageRef并使用UIImage的alloc、init和release来尽快释放内存。

目前,我不知道如何隔离这个问题。你会如何处理这个问题?

代码语言:javascript
复制
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**
EN

回答 3

Stack Overflow用户

发布于 2009-09-26 14:24:19

您是否正在捕捉和处理内存警告?您的代码可能只是占用了太多内存。尝试在视图控制器中使用-(void)didReceiveMemoryWarning方法来查看它是否被调用。

这种行为与您所看到的是一致的,因为iPhone设备的内存非常有限,但是iPhone模拟器仅受计算机中RAM的限制。

票数 0
EN

Stack Overflow用户

发布于 2009-09-27 14:47:20

我注释掉了一些行,并围绕某些代码片段构建了一些繁重的for-循环,以隔离和发现问题。原来,我已经删除了一条较小的方法中的一行,这条线应该在计算之后清除:

代码语言:javascript
复制
CGImageRelease(result);

所以当生成新图像时,旧的结果被泄露了。

我不知道为什么Clang或Instuments没有发现这个漏洞。但是谢谢你的帮助!

票数 0
EN

Stack Overflow用户

发布于 2009-09-27 21:10:13

你所说的“泄漏”是指仪器泄漏工具吗?这可能不会“看到”您的CG调用占用的内存泄漏,因为它们是错误的.

使用ObjectAlloc并查看在短时间内保存的内存(拖过时间线,按住选项以查看一小部分时间)会好很多倍。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1481183

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档