首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的内存泄漏

奇怪的内存泄漏
EN

Stack Overflow用户
提问于 2012-06-19 19:45:04
回答 3查看 135关注 0票数 0

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

提前谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-19 19:49:49

这其实并不奇怪,看看你是如何通过[[NSArray alloc] initQueryQuery1分配内存的。但随后,您通过调用[database executeQuery:]覆盖了它们的指针,因此分配的内存将会泄漏。

看起来您并不真正需要数组分配,所以您只需删除该行即可。然而,[Query release][Query1 release]没有使应用程序崩溃(或至少在以后的某个时刻),这表明[database executeQuery:]返回保留的内存,因此将其所有权委托给调用者,这是内存指南所不鼓励的。您应该从executeQuery:返回一个自动释放的对象,因为您从未使用过返回值,所以您可以简单地将该方法缩减为:

代码语言:javascript
复制
[self databaseOpen];
[database executeQuery:@"Delete from ActivityList"];
[database executeQuery:@"Select* from ActivityList"];
票数 4
EN

Stack Overflow用户

发布于 2012-06-19 19:50:41

问题是:

代码语言:javascript
复制
NSArray *Query = [[NSArray alloc] init];
// later:
Query = [database executeQuery:str];

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

代码语言:javascript
复制
NSArray *Query = [[NSArray alloc] init];

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

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

(顺便问一下,您是否在使用我的SQLHelper库?如果是,则不能释放查询返回的数组;它是自动释放的,在过度释放时将崩溃)

票数 3
EN

Stack Overflow用户

发布于 2012-06-19 19:52:42

这是因为您正在为QueryQuery1分配NSArray,但从未使用过它们,因此您会立即将指针更改为其他对象,即您的[xxxx executeQuery:xxx]。将它们更改为这些,应该没问题。

代码语言:javascript
复制
NSArray* Query = [database executeQuery:str];
NSArray* Query1 = [database executeQuery:str1];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11100226

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档