gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:49:05 24 4
gpt4 key购买 nike

我的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com