2010-10-11 69 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