代码之家  ›  专栏  ›  技术社区  ›  Goz

iPhone内存泄漏问题

  •  0
  • Goz  · 技术社区  · 14 年前

    我继承了一段Objective-C代码,泄漏跟踪工具已经识别出代码中的内存泄漏。我不完全了解Objective-C的内存跟踪规则,所以我对理解内存泄漏的原因有一个真正的问题。代码如下:

    + (NSString *) getRecordingsDirectory
    {   
    
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);   
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *tmpRecordingsDirectory = [documentsDirectory stringByAppendingPathComponent: @"Recordings"];
        NSFileManager* fileManager = [[NSFileManager alloc] init];
        BOOL result;
        if ([fileManager fileExistsAtPath:tmpRecordingsDirectory isDirectory:&result] == FALSE)
        {
            NSError* error;
            [[NSFileManager defaultManager] createDirectoryAtPath: tmpRecordingsDirectory withIntermediateDirectories:TRUE attributes:nil error:&error];
            // TODO - handle error return
        }
    
        [fileManager release];
        [documentsDirectory release];
        [paths release];
        return tmpRecordingsDirectory;
    
    }
    

    标记为泄漏的部分是第一行。如你所见,我一直在玩“释放”的各种项目,看看是否有任何区别。我认为它应该自动释放路径变量。然而,情况似乎并非如此。

    那么有人能告诉我我做错了什么以及如何消除内存泄漏吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Jeroen de Leeuw    14 年前

    您不应该释放Paths对象和DocumentsDirectory对象,因为您没有分配它。阅读以下内容 documentation 释放物体。

    如果使用以下代码,可以释放它;

    NSArray *paths = [[NSArray alloc] initWithArray:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)];
    NSString *documentsDirectory = [[NSString alloc] initWithFormat:@"%@", [paths objectAtIndex:0]];
    
        2
  •  0
  •   Goz    14 年前

    我的思路中缺少一个非自动释放池,这就是导致我泄密的原因:(D'Oh。