首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CoreFoundation框架导致的内存泄漏

CoreFoundation框架导致的内存泄漏
EN

Stack Overflow用户
提问于 2011-01-10 22:12:45
回答 4查看 2.2K关注 0票数 5

我正在开发一个主要利用地址簿和数据库的iPhone应用程序。在从地址簿中获取了大约3000个联系人后,我将字符串标记附加到联系人(每个联系人5个)。我正在数据库中保存我的标签。

出于负载测试的目的,我在App中添加了10,000个标签。但在我的应用程序的负载测试期间,我观察到一些内存泄漏,这些内存泄漏与应用程序代码无关,但代表了一组指令集。此外,仪器还显示基金会作为泄漏的责任库(广泛使用属于基金会框架的NSStringNSDictionaryNSArray )。我的应用程序在usage.The崩溃报告提到的10 - 15分钟后崩溃,应用程序由于内存不足而崩溃。

使用CLANG的内存分析显示零泄漏。如何解决这些内存泄漏问题?这些泄密是坠机背后的真正罪魁祸首吗?有没有其他工具可以用来检查内存泄漏?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-19 01:39:28

我经常发现我的漏洞说它们是由Core Foundation (或任何其他框架)造成的,但实际上是我自己的。除了模拟器之外,你很少在框架中发现过多的泄漏。

如果您打开Instruments中右侧的详细信息面板,您可能会发现其中列出了您的应用程序的方法。这将为您指出它可能来自于您的代码中的何处。一个漏洞可能会引发许多其他漏洞,您可能必须找到最高级别的罪魁祸首来摆脱较低级别的漏洞。

除了发现最明显的漏洞之外,您不应该期望Clang做任何事情。它非常方便,但仅此而已,只是对编译的一个有用的补充。

票数 4
EN

Stack Overflow用户

发布于 2011-01-19 01:34:52

clang不是一个检漏器。它只检测到一小部分问题。

对于内存泄漏调试,您应该关注工具,特别是对象分配和泄漏工具。不过,一定要了解泄漏和其他高内存使用率来源之间的区别。

一旦您确定对象正在泄漏,使用Instruments检查它们的分配堆栈跟踪(这样您就可以知道它是什么对象),以及它们的保留/释放历史记录。

如果这不是泄漏,那么我建议在这里调查说明:http://www.friday.com/bbum/2010/10/17/when-is-a-leak-not-a-leak-using-heapshot-analysis-to-find-undesirable-memory-growth/

票数 1
EN

Stack Overflow用户

发布于 2011-01-23 05:24:04

最有可能的情况是,您有创建基础对象的代码。Leaks向您显示了分配的位置,但这通常是由于您的代码在创建对象时所做的调用。您可以查看Instruments中的调用链,并沿着调用链返回,直到您到达您的代码-这是您导致分配的地方。现在,对于该分配,请查看该对象的内存处理:您会在稍后释放它吗?

有很多方法可以使你无法释放内存属性,所以很难猜测你会碰到哪一个。在帮助人们时,我看到的一些方法包括分配对象,并通过具有retain属性的属性将其分配给实例变量,如下所示:

@property (retain) NSString* myString;

..。

self.myString = [NSString alloc:@"foo"];

alloc+init创建一个保留的对象,self.myString =再次递增保留计数。如果编码正确,dealloc方法将通过以下方式之一释放属性:

myString释放;或self.myString = nil;

这会处理使用self.myString =添加的保留,但不会处理创建时的保留。解决方案,以下选项之一:

myString = [NSString alloc:@"foo"];//不调用setter方法,因此不保留赋值-但不调用setter,如果不是简单的setter,这可能是不好的。

self.myString = [[NSString alloc:@"foo"]自动释放];

自动释放释放alloc+init保留。

现在,当然,这是一个人为的例子,因为你可能真的会使用:

self.myString = NSString stringWithString:@"foo";

这是一个类方法,返回一个自动释放的字符串,避免了这个问题。但是我们的想法是展示一个简单的例子来解释这种类型的问题。

有许多其他方法不能正确释放内存,但建议您在代码之前沿着调用链向上工作,查看触发内存分配的位置,然后找出没有正确释放内存的原因。

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

https://stackoverflow.com/questions/4647650

复制
相关文章

相似问题

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