在循环iOS中使用alloc内存泄漏

时间:2012-09-12 20:59:05

标签: 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.
            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];

2 个答案:

答案 0 :(得分:2)

每个alloc / init必须与某个地方的版本或自动释放进行平衡。我没有看到您的VC的任何版本,也没有发现以前的content值的任何版本。

所以这里有一些代码问题:

  • 如果while循环执行多次,您没有任何保护。 (实际上,当它根本不执行时(SQL错误或没有结果),你似乎没有任何保护,但这是另一回事)。这意味着如果您的结果不符合您的预期,您将会泄漏
  • 因此,您应该在循环中将其分配给新值之前释放先前的内容值,这样的情况内容不会是内存不均衡。 使用属性代替ivars的一个原因是更安全,顺便说一下,见下文。
  • 您的 detailsArtViewController永远不会发布因此可能泄漏源 (顺便说一句,类名应以大写字母开头。惯例将帮助其他人更好地理解你的代码,并为你理解符号是什么给你带来很多麻烦,确保KVC有效,等等,所以你应该尽快采用它)

这里有多个建议,我强烈建议遵循:

  • Read the documentation 遵循内存管理政策。规则非常简单(每个alloc / copy / mutableCopy必须由release / autorelease进行平衡...这就是您需要知道的全部内容,至少它基本上是最重要的规则。)
  • 我强烈建议 use properties instead of instance variables (如果content是一个ivar而不是你的本地var?)。感谢现代运行时 - 从iOS开始就可以使用 - 您不需要为您的属性创建实例变量,@synthesize指令将为您完成(在现代Objective-C中发布最后一个Xcode / LLVM编译器,你甚至不需要@synthesize指令。在任何地方使用属性而不是实例变量(使用self.content而不是content将确保调用属性的setter,从而正确完成内存管理之前的值并保留新值(对于retain属性),因此您不必担心释放旧值,这与直接使用实例变量相反。
  • 您可以 use ARC 以避免泄密,避免自己跳舞retain / release 。当然我不建议ARC作为“避免学习内存管理的方法”:理解内存管理如何工作仍然非常有用,至少为了避免保留周期和类似的事情,但它<通过避免打扰retain / release来电,强大>会让事情变得更容易,所以对初学者来说通常更容易,即使我仍然建议学习内存管理来理解逻辑和微妙之处(ARC也可能出现这种情况)。

答案 1 :(得分:0)

迁移到ARC,然后您根本不必担心这种泄漏。这对初学者来说很棒。

http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html