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

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

最佳答案

每个 alloc/init 都必须与某处的 release 或 autorelease 平衡。我没有看到您的 VC 的任何版本,也没有看到任何 content 的先前值的版本(如果有的话)。

因此您的代码存在一些问题:

  • 如果您的 while 循环执行多次,您将得不到任何保护。 (实际上,当它根本不会执行(SQL 错误或无结果)时,您似乎没有任何保护,但那是另一回事)。这意味着,如果您的结果不是您预期的那样,您将遇到泄漏
  • 因此,您应该在循环中释放 content 的先前值,然后再将其分配给新值,这样内容不为零的情况下内存将得到平衡。 这就是使用 properties 而不是 ivars 更安全的原因之一,顺便说一下,请参见下文。
  • 您的detailsArtViewController 从未发布因此也可能您的泄漏源(顺便说一句,类名应以大写字母开头。在命名之后约定将帮助其他人更好地理解您的代码,并为您省去很多理解符号、确保 KVC 工作等方面的麻烦,因此您也应该尽快采用它)

此处有多个建议,我强烈建议您遵循:

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

关于ios - 在 iOS 循环中使用 alloc 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12396113/

相关文章:

ios - 在 iOS 中将一个或多个格式化程序与页面呈现器一起使用

ios - 将 base64string 发送到服务器但服务器获取损坏的数据

ios - NSData 与 NSValue?如何在 sendMIDISysExEvent :(NSData *)midiData 中封装 C 结构

python - 在不实例化任何对象的情况下使用实例方法可能是危险的还是有用的?

ios - 我可以在 Linux 上签署 iOS 应用程序吗? (也许使用协同设计端口?)

c# - 如何 "free"Microsoft.Office.Interop.Word.Application wordApp 实例?

javascript - Settimeout和setinterval内存使用情况

c++ - 在 64 位系统的低地址分配内存的最可靠/可移植的方法是什么?

c++ - 愚蠢的STL问题

ios - 点击通知时显示 ViewController