我的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];
答案 0 :(得分:2)
每个alloc / init必须与某个地方的版本或自动释放进行平衡。我没有看到您的VC的任何版本,也没有发现以前的content
值的任何版本。
所以这里有一些代码问题:
while
循环执行多次,您没有任何保护。 (实际上,当它根本不执行时(SQL错误或没有结果),你似乎没有任何保护,但这是另一回事)。这意味着如果您的结果不符合您的预期,您将会泄漏。这里有多个建议,我强烈建议遵循:
alloc
/ copy
/ mutableCopy
必须由release
/ autorelease
进行平衡...这就是您需要知道的全部内容,至少它基本上是最重要的规则。)content
是一个ivar而不是你的本地var?)。感谢现代运行时 - 从iOS开始就可以使用 - 您不需要为您的属性创建实例变量,@synthesize
指令将为您完成(在现代Objective-C中发布最后一个Xcode / LLVM编译器,你甚至不需要@synthesize
指令。在任何地方使用属性而不是实例变量(使用self.content
而不是content
)将确保调用属性的setter,从而正确完成内存管理之前的值并保留新值(对于retain
属性),因此您不必担心释放旧值,这与直接使用实例变量相反。retain
/ release
。当然我不建议ARC
作为“避免学习内存管理的方法”:理解内存管理如何工作仍然非常有用,至少为了避免保留周期和类似的事情,但它<通过避免打扰retain
/ release
来电,强大>会让事情变得更容易,所以对初学者来说通常更容易,即使我仍然建议学习内存管理来理解逻辑和微妙之处(ARC也可能出现这种情况)。答案 1 :(得分:0)
迁移到ARC,然后您根本不必担心这种泄漏。这对初学者来说很棒。