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

发布于 2012-06-19 19:49:49
这其实并不奇怪,看看你是如何通过[[NSArray alloc] init为Query和Query1分配内存的。但随后,您通过调用[database executeQuery:]覆盖了它们的指针,因此分配的内存将会泄漏。
看起来您并不真正需要数组分配,所以您只需删除该行即可。然而,[Query release]和[Query1 release]没有使应用程序崩溃(或至少在以后的某个时刻),这表明[database executeQuery:]返回保留的内存,因此将其所有权委托给调用者,这是内存指南所不鼓励的。您应该从executeQuery:返回一个自动释放的对象,因为您从未使用过返回值,所以您可以简单地将该方法缩减为:
[self databaseOpen];
[database executeQuery:@"Delete from ActivityList"];
[database executeQuery:@"Select* from ActivityList"];发布于 2012-06-19 19:50:41
问题是:
NSArray *Query = [[NSArray alloc] init];
// later:
Query = [database executeQuery:str];因此,您分配了一个NSArray,然后重用了它的指针,因此您释放了对第一个分配的对象的引用。你不需要这样做
NSArray *Query = [[NSArray alloc] init];因为executeQuery:方法返回一个初始化的数组。
Query1也是如此(您也错误地分配了它)。
(顺便问一下,您是否在使用我的SQLHelper库?如果是,则不能释放查询返回的数组;它是自动释放的,在过度释放时将崩溃)
发布于 2012-06-19 19:52:42
这是因为您正在为Query和Query1分配NSArray,但从未使用过它们,因此您会立即将指针更改为其他对象,即您的[xxxx executeQuery:xxx]。将它们更改为这些,应该没问题。
NSArray* Query = [database executeQuery:str];
NSArray* Query1 = [database executeQuery:str1];https://stackoverflow.com/questions/11100226
复制相似问题