Проблема с утечкой памяти iPhone - PullRequest
0 голосов
/ 11 октября 2010

У меня есть фрагмент кода 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 ]

2 голосов
/ 11 октября 2010

Вы не должны освобождать объект paths и объект DocumentsDirectory, потому что вы не выделили его. Прочитайте следующую документацию об освобождении объектов.

Вы можете освободить его, если используете следующий код;

NSArray *paths = [[NSArray alloc] initWithArray:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)];
NSString *documentsDirectory = [[NSString alloc] initWithFormat:@"%@", [paths objectAtIndex:0]];
0 голосов
/ 11 октября 2010

Мне не хватало NSAutoreleasePool в моей ветке, и это было причиной моих утечек :( D'oh.

...