【问题标题】:iphone: memory leak while reading data in loop from datatbaseiphone:从数据库循环读取数据时内存泄漏
【发布时间】:2011-06-04 08:24:29
【问题描述】:

谁能帮我解释一下为什么这段代码会泄漏,我们该如何处理?

const char *sqlStatement = "SELECT * FROM VIOLATIONS_TBL";

sqlite3_stmt *compiledStatement;

if (sqlite3_prepare(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {

    while (sqlite3_step(compiledStatement) == SQLITE_ROW) {

        NSString *recSTR=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
        [self.pickerList addObject:recSTR];
        [recSTR release];
        recSTR=nil;             

    }
}

recSTR 在这种情况下会泄漏,我已经尝试了下面提到的所有解决方案,但都没有奏效 提前感谢

【问题讨论】:

  • pickerList 是一个数组数组,内部数组包含一个字符串。因此 tempRowArray 的保留计数为 1,否则 pickerList 将具有指向无效引用的指针。释放或清除 pickerList 应该释放所有 tempRowArrays。哪里漏了?

标签: iphone memory memory-leaks


【解决方案1】:

如果你的循环运行了很多次,那么使用自动释放池

循环{
NSAutoreleasePool *innerPool = [[NSAutoreleasePool alloc] init];

...code goes here...

[innerPool release];

}

它可能会帮助您防止内存泄漏

【讨论】:

  • 自动释放池如何防止泄漏?它仅对放弃不应在当前池范围内释放的对象的所有权有用。它不是一个神奇的垃圾收集器。
  • 每次自动释放被发送到一个对象,它被添加到最外层的自动释放池中。当池被耗尽时,它只是向池中的所有对象发送释放。
  • 是的,它没有解决问题泄漏仍然存在
  • 还可以做一件事。在泄漏的地方创建一个 NSString 实例,然后您可以释放该字符串或使其自动释放。这可能会有所帮助。
【解决方案2】:

解决方案泄漏在这里

[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]

处理一下,我们就完成了

【讨论】:

  • 请分享您的完整解决方案。您是如何处理这个问题的?这将对社区有所帮助
  • 你改变了你原来的问题吗?当我试图找到您在问题中发布的代码中的泄漏时,这有点令人困惑。
  • @PHP:他使用了[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)] 行而不是NSString *recSTR=[[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]; 一个
猜你喜欢
  • 2011-02-10
  • 1970-01-01
  • 2011-03-15
  • 2015-05-06
  • 2014-04-29
  • 1970-01-01
  • 2011-09-27
  • 2011-04-24
  • 1970-01-01
相关资源
最近更新 更多