ARC的内存占用空间很大

时间:2012-06-12 00:29:39

标签: objective-c memory-management automatic-ref-counting autorelease

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;

        ...

    }

    ...

}

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

1 个答案:

答案 0 :(得分:9)

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

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

readDataOfLength返回自动释放的数据,因为你坚持在该循环中,因此它的方法是自动释放的数据,直到你的循环和封装方法完成后才会释放。