内存泄漏,alloc内置,而循环iOS

内存泄漏,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.

我的iOS应用程序内存泄漏,我对iOS中的内存管理非常陌生。请建议如何解决以下问题

泄漏的变量是内容。如果我按照下面代码中显示的方式释放(当前已注释掉),对象仍在泄漏。此外,while循环将始终执行一次

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中)