2010-10-11 42 views
0

我有一块Objective-C代码,我已经继承,漏洞跟踪工具已经在代码中识别出内存泄漏。我并不完全了解Objective-C的内存跟踪规则,所以我在理解内存泄漏的原因时遇到了一个实际问题。代码如下:iPhone内存泄漏的问题

+ (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; 

} 

被标记为泄漏的部分是第一行。正如你所看到的,我一直在玩“释放”那里的各种物品,看看它是否有任何区别。我认为它应该自动释放路径变量。但是,这似乎并不是这种情况。

因此,任何人都可以告诉我我做错了什么,以及如何消除这种内存泄漏?

回答

0

我缺少NSAutoreleasePool在我的线索,这是什么导致我的泄漏:(D'哦

2

您不应该释放paths对象和documentsDirectory对象,因为您没有分配它。阅读下面的documentation发布对象。

如果您使用以下代码,则可以将其释放;

NSArray *paths = [[NSArray alloc] initWithArray:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)]; 
NSString *documentsDirectory = [[NSString alloc] initWithFormat:@"%@", [paths objectAtIndex:0]]; 
+0

我是知道的......但我是在救命稻草。)我”但我发现了我的问题的来源。原来你创建一个单独的线程时需要创建一个NSAutoreleasePool :( – Goz 2010-10-11 10:52:18