App我正在使用ARC。我希望它能够处理大型文件,因此我不是整个加载文件,而是使用NSFileHandle readDataOfLength方法加载数据块。它发生在一个循环中,重复直到整个文件被处理:
- (NSString*)doStuff { // called with NSInvocationOperation
// now we open the file itself
NSFileHandle *fileHandle =
[NSFileHandle fileHandleForReadingFromURL:self.path
error:nil];
...
BOOL done = NO;
while(!done) {
NSData *fileData = [fileHandle readDataOfLength: CHUNK_SIZE];
...
if ( [fileData length] == 0 ) done = YES;
...
}
...
}
根据剖析器,没有内存泄漏;但是,我的应用程序在处理文件时会占用大量内存。我猜 - 自动释放只在我处理完文件后才出现。我可以在不切换到手动内存管理的情况下修复它吗?
答案 0 :(得分:9)
使用自动释放池将代码包装在该循环中。
while(!done)
{
@autoreleasepool
{
NSData *fileData = [fileHandle readDataOfLength: CHUNK_SIZE];
...
if ( [fileData length] == 0 )
{
done = YES;
}
...
}
};
readDataOfLength
返回自动释放的数据,因为你坚持在该循环中,因此它的方法是自动释放的数据,直到你的循环和封装方法完成后才会释放。