内存泄漏,alloc内置,而循环iOS
我的iOS应用程序内存泄漏,我对iOS中的内存管理非常陌生。请建议如何解决以下问题 泄漏的变量是内容。如果我按照下面代码中显示的方式释放(当前已注释掉),对象仍在泄漏。此外,while循环将始终执行一次内存泄漏,alloc内置,而循环iOS,ios,memory-management,Ios,Memory Management,我的iOS应用程序内存泄漏,我对iOS中的内存管理非常陌生。请建议如何解决以下问题 泄漏的变量是内容。如果我按照下面代码中显示的方式释放(当前已注释掉),对象仍在泄漏。此外,while循环将始终执行一次 if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) { // We "step" through the results - once for each row.
if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) {
// We "step" through the results - once for each row.
while (sqlite3_step(statement) == SQLITE_ROW) {
content = [[NSString alloc] initWithUTF8String:
(const char *) sqlite3_column_text(statement, 1)];
}
}
}
detailsArtViewController *det = [[detailsArtViewController alloc] init];
NSString *decodeString = [self htmlEntityDecode:content];
//[content release];
迁移到ARC,您就不必担心这个泄漏了。这对初学者来说很好
每个alloc/init都必须在某个地方平衡释放或自动释放。我没有看到你的VC有任何版本,也没有看到以前的
内容的值有任何版本
因此,您的代码存在一些问题:
- 如果您的
while
循环执行多次,您没有任何保护。(实际上,当它根本不执行(SQL错误或无结果)时,您似乎没有任何保护,但这是另一回事)。这意味着,如果您的结果不是您所期望的,您将得到泄漏
- 因此,在将内容分配给循环中的新值之前,您应该释放内容的先前值,这样,在内容不为零的情况下,内存将得到平衡。这是使用属性而不是IVAR更安全的一个原因,顺便说一句,请参见下文
- 您的详细信息视图控制器永远不会发布,因此也可能是泄漏源(顺便说一句,类名应该以大写字母开头。遵循命名约定将有助于其他人更好地理解您的代码,并为您节省理解符号、确保KVC正常工作等方面的大量麻烦,因此您也应该尽快采用它)
这里有许多建议,我强烈建议遵循:
- 和遵循内存管理策略。规则非常简单(每个
alloc
/拷贝
/可变拷贝
必须通过释放
/自动释放
来平衡,这是您必须知道的全部,至少它基本上是最重要的规则)
- 我强烈建议(如果
content
在您的情况下是一个ivar而不是一个本地var?)。多亏了现代运行时--从iOS开始就可以使用它--您不需要为属性创建实例变量,@synthesis
指令将为您完成此任务(在上一个Xcode/LLVM编译器发布的现代Objective-C中,您甚至不需要@synthesis
指令)将确保调用属性的setter,从而正确地完成内存管理释放以前的值并保留新值(对于retain
properties),因此与直接使用实例变量相反,您不必担心释放旧值
- 您可以避免泄漏,并且避免必须执行
保留/释放自己跳舞。当然,我不建议将ARC
作为“避免学习内存管理的一种方法”:了解内存管理的工作原理仍然非常有用,至少可以避免保留周期之类的事情,但是通过避免对保留
/释放
调用的麻烦,它会让事情变得更容易,所以对于初学者来说通常更容易,即使我仍然建议学习内存管理来理解逻辑和微妙之处(也可能出现在ARC中)