Утечка памяти в removeItemAtPath: ошибка:? - PullRequest
1 голос
/ 17 июля 2009

Я запускаю на iPhone приложение, которое выполняет следующее действие:

+ (void)performWrite:(NSData *)data {
    [data retain];
    [data writeToFile:@"WriteTest.tst" atomically:YES];
    [[NSFileManager defaultManager] removeItemAtPath:@"WriteTest.tst" error:NULL];
    [data release];
}

При работе в Instruments, однако, я вижу утечку при каждом вызове removeItemAtPath:error со следующим следом внутренней утечки:

9 MyApplication +[StorageUtil performWrite:]
   8 Foundation -[NSFileManager removeItemAtPath:error:]
   7 Foundation +[NSFilesystemItemRemoveOperation filesystemItemRemoveOperationWithPath:]
   6 Foundation -[NSOperation init]
   5 CoreFoundation +[NSObject new]
   4 CoreFoundation +[NSObject alloc]

Эта трассировка стека предоставляется как источник утечки NSRecursiveLock и объекта _NSOperationData. Поэтому меня интересует, правильно ли я использую метод removeItemAtPath:error: или действительно есть утечка. Я решил проверить здесь, прежде чем отправлять его на радар.

Обратите внимание, что аргумент data правильно придерживается цикла сохранения / освобождения вне этого вызова метода. Я не верю, что это источник утечки.

1 Ответ

1 голос
/ 17 июля 2009

Функция была вызвана в отдельном потоке (созданном с помощью pthread_create ()) и поэтому не была обернута в NSAutoreleasePool. Создание пула перед вызовом метода и его последующее использование помогло устранить утечку.

...