奇怪的内存泄漏

Posted

技术标签:

【中文标题】奇怪的内存泄漏【英文标题】:Strange Memory leak 【发布时间】:2012-06-19 11:45:04 【问题描述】:

我一直在使用使用 sqlite 数据库的 iPhone 应用程序。我已经检查了 iPad、iPhone 4 中的内存泄漏,并且没有内存泄漏。但相同的代码显示 iPhone-3GS 中的内存泄漏。请看下面的屏幕截图,我认为没有泄漏,而不是仪器显示泄漏后。请给我建议。

提前致谢。

【问题讨论】:

【参考方案1】:

其实并不奇怪,看看你是如何通过[[NSArray alloc] initQueryQuery1 分配内存的。但是,你调用[database executeQuery:]覆盖了它们的指针,所以分配的内存泄露了。

看起来您实际上并不需要数组分配,因此您可以简单地删除该行。但是,[Query release][Query1 release] 不会使应用程序崩溃(或至少在以后的某个时间点),这表明 [database executeQuery:] 返回保留的内存,因此将其所有权委托给调用者,内存不鼓励这样做指导方针。您应该从 executeQuery: 返回一个自动释放的对象,因为您从不使用返回的值,您可以简单地将方法简化为:

[self databaseOpen];
[database executeQuery:@"Delete from ActivityList"];
[database executeQuery:@"Select* from ActivityList"];

【讨论】:

是的,你说得对。之后它也应该在 iPhone 4 和 iPad 中泄漏,但除了 iPhone-3GS 之外,它没有显示任何内存泄漏,这让我感到困惑。 @Nit 我不太确定为什么它没有在 iPhone 4 上显示泄漏,但请记住 Instruments 泄漏检测非常保守。如果不是 100% 确定是泄漏,它就不会显示泄漏,因此泄漏在 iPhone 4 上很可能被视为假/阳性。 我也有同样的想法,我也遇到了 UIImagePicker 的内存泄漏问题,这也很奇怪,但我得到了解决方案。现在,我对 Xcode 开发环境感到困惑。由于框架或苹果开发工具(我认为苹果开发工具的错误比我的任何应用程序都多),我几乎是第 10 次陷入困境。【参考方案2】:

问题是这样的:

NSArray *Query = [[NSArray alloc] init];
// later:
Query = [database executeQuery:str];

因此,您分配了一个 NSArray,然后重用它的指针,因此您失去了对第一个分配对象的引用。你不需要这样做

NSArray *Query = [[NSArray alloc] init];

因为executeQuery: 方法返回一个初始化的数组。

同样适用于 Query1(您也错误地分配了它)。

(顺便问一下,你在使用我的 SQLHelper 库吗?如果是,你必须释放查询返回的数组;它是自动释放的,并且会在过度释放时崩溃)

【讨论】:

【参考方案3】:

这是因为您为QueryQuery1 分配了NSArray,但从不使用它们,您立即将指针更改为您的[xxxx executeQuery:xxx]。 把它们改成这些就可以了。

NSArray* Query = [database executeQuery:str];
NSArray* Query1 = [database executeQuery:str1];

【讨论】:

以上是关于奇怪的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 帮助:CoreLocation 框架中的奇怪内存泄漏

C++ 中的 new/delete 导致奇怪的内存泄漏

初始化推送通知时发生奇怪的 ionic 内存泄漏导致冻结

在 ARC 中使用 Blocks 和以某种方式复制的奇怪内存泄漏

使用 Eigen 和 boost::thread 在 C++ 中出现奇怪的内存泄漏

fprintf 内存泄漏