0

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

提前致谢。

在此处输入图像描述

4

3 回答 3

4

它实际上并不奇怪,看看你如何为两者分配Query内存Query1via [[NSArray alloc] init。但是,您通过调用覆盖它们的指针[database executeQuery:],因此分配的内存被泄漏。

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

[self databaseOpen];
[database executeQuery:@"Delete from ActivityList"];
[database executeQuery:@"Select* from ActivityList"];
于 2012-06-19T11:49:49.163 回答
3

问题是这样的:

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

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

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

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

Query1 也是如此(您也错误地分配了它)。

(顺便说一句,你在使用我的 SQLHelper 库吗?如果是这样,你不能释放查询返回的数组;它是自动释放的,并且会在过度释放时崩溃)

于 2012-06-19T11:50:41.243 回答
1

那是因为您正在分配NSArray但从不使用它们QueryQuery1您立即将指针更改为其他东西,即您的[xxxx executeQuery:xxx]. 将它们更改为这些,应该没问题。

NSArray* Query = [database executeQuery:str];
NSArray* Query1 = [database executeQuery:str1];
于 2012-06-19T11:52:41.703 回答