我正在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
参数正确地遵循此方法调用之外的保留/释放周期。我不相信这是泄漏的来源。
答案 0 :(得分:1)
该函数在一个单独的线程中调用(使用pthread_create()创建),因此没有包装在NSAutoreleasePool中。在方法调用之前创建池并在之后排空它来处理泄漏。