2

我正在开发的应用程序使用 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;

        ...

    }

    ...

}

根据分析器,没有内存泄漏;但是,我的应用程序在处理文件时会占用大量内存。我的猜测——自动释放只有在我处理完文件之后才会出现。我可以在不切换到手动内存管理的情况下修复它吗?

4

1 回答 1

9

使用自动释放池将代码包装在该循环中。

while(!done) 
{
    @autoreleasepool
    {
        NSData *fileData = [fileHandle readDataOfLength: CHUNK_SIZE];
        ...
        if ( [fileData length] == 0 ) 
        {
            done = YES;
        }
        ...                
    }
};

readDataOfLength重新调整自动释放的数据,并且由于您坚持该循环及其方法,因此该自动释放的数据在您的循环和封装方法完成之前不会被释放。

于 2012-06-12T00:47:48.017 回答