奇怪的内存泄漏

时间:2012-06-19 11:45:04

标签: iphone ios memory-management memory-leaks

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

先谢谢。

enter image description here

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:3)

问题在于:

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

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

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

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

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

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

答案 2 :(得分:1)

那是因为您为NSArrayQuery分配了Query1但从未使用它们,您立即将指针更改为其他内容[xxxx executeQuery:xxx]。 将它们改为这些,应该没问题。

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