removeItemAtPath中的内存泄漏:错误:?

时间:2009-07-17 17:27:44

标签: iphone objective-c cocoa cocoa-touch xcode

我正在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:方法,或者是否确实存在泄漏。我想在将它提交给Radar之前我会在这里查看。

请注意,data参数正确地遵循此方法调用之外的保留/释放周期。我不相信这是泄漏的来源。

1 个答案:

答案 0 :(得分:1)

该函数在一个单独的线程中调用(使用pthread_create()创建),因此没有包装在NSAutoreleasePool中。在方法调用之前创建池并在之后排空它来处理泄漏。