【问题标题】:iphone NSSearchPathForDirectoriesInDomains memory leak?iphone NSSearchPathForDirectoriesInDomains 内存泄漏?
【发布时间】:2011-05-01 22:20:18
【问题描述】:

我是 iPhone ObjectiveC 开发的新手。运行以下方法时出现内存泄漏。

- (NSString *) getDBPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:@"dbname.sqlite"];
}

我发现,如果我将其修剪到以下内容......它仍然会泄漏

 - (NSString *) getDBPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    return nil;
}

所以我尝试使用以下方法释放路径变量,但仍然会泄漏内存。

 - (NSString *) getDBPath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    [paths release];
    return nil;
}

为了检测泄漏,我在分析器中使用以下循环运行它:

for (int iLoop = 0; iLoop < 30; iLoop++) {
    NSString *dbPath = [self getDBPath];
    [dbPath release];
    sleep(1);
}

与 NSPathStore2 和 NSArrayM 相关的内存量继续增长。

对我可能做错的事情有什么建议吗? 谢谢!

【问题讨论】:

  • 什么是泄漏?你的第一种方法是完全合理的,正是你应该做的。
  • 在分析器中运行它,在循环内。我刚刚更新了上面的原始问题,提供了有关循环的更多详细信息。
  • NSZombieEnabled 仍然有效?或者没有 NSAutoReleasePool 因为它在后台运行?
  • 我对实际的分析没有启示,但重新测试一下:如果你没有在任何地方保留它,你不应该释放字符串,并且自动释放池不会直到事件循环之后才被耗尽。也就是说,不确定您为什么会看到泄漏。
  • 我认为还有其他原因,因为这些行不会泄露给我。

标签: iphone ios memory memory-leaks


【解决方案1】:

您的 getDBPath 代码很好,但它可能是从没有任何自动释放池的上下文中调用的。

通过在循环代码中分配您自己的池来修复它:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
for (int iLoop = 0; iLoop < 30; iLoop++) {
    NSString *dbPath = [self getDBPath];
    // [dbPath release]; // do not release! dbPath will be autoreleased
    sleep(1);
}
[pool drain];

【讨论】:

    【解决方案2】:

    你不应该释放你不拥有的对象。在您的情况下,您正试图释放您没有拥有的内存。正如在“路径”中一样,总是指由“NSSearchPathForDirectoriesInDomains”分配和管理的内存。所以在这种情况下你不应该释放内存。制定一般规则,除非您自己分配内存,否则您不应该为程序中使用的每个指针调用释放内存。希望这会有所帮助!

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 2011-12-10
      • 2011-05-24
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多