我一直在使用我正在使用sqlite数据库的iPhone应用程序。我已经检查过iPad,iPhone 4中的内存泄漏,并且没有内存泄漏。但是相同的代码显示了iPhone-3GS中的内存泄漏。请看下面的scree-shot,我认为没有泄漏,而不是仪器显示泄漏。请建议我。
先谢谢。
答案 0 :(得分:4)
实际上并不奇怪,看看你如何通过Query
为Query1
和[[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)
那是因为您为NSArray
和Query
分配了Query1
但从未使用它们,您立即将指针更改为其他内容[xxxx executeQuery:xxx]
。
将它们改为这些,应该没问题。
NSArray* Query = [database executeQuery:str];
NSArray* Query1 = [database executeQuery:str1];