Objective c ARC的巨大内存占用

Objective c ARC的巨大内存占用,objective-c,memory-management,automatic-ref-counting,autorelease,Objective C,Memory Management,Automatic Ref Counting,Autorelease,我正在开发的应用程序使用ARC。我想让它处理大文件,所以我不是整体加载文件,而是使用NSFileHandle readDataOfLength方法加载数据块。它发生在一个循环中,循环会重复,直到处理完整个文件: - (NSString*)doStuff { // called with NSInvocationOperation // now we open the file itself NSFileHandle *fileHandle = [NSFileHandl

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

        ...

    }

    ...

}

根据profiler,没有内存泄漏;然而,我的应用程序在处理文件时消耗了大量内存。我的猜测-只有在我处理文件后才会自动释放。我可以在不切换到手动内存管理的情况下修复它吗?

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

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

readDataOfLength
retuns自动删除的数据,由于您坚持在该循环及其方法中,自动删除的数据在循环和封装方法完成之前不会被释放。

请发布与您的problem@mdvs它不容易用谷歌搜索;你能提供一个链接到你所说的吗?如果我建议的方法对你不起作用(因为我不知道标记特定的实现文件要从ARC中排除是一个标准特性),考虑使用一种不同的方法读取数据——例如CopeFoels:Cudith> cFrADFraseRead < /Cord>。“标记要从ARC中排除的特定实现文件是一个标准功能”好吧,我的答案似乎就在这里。实际上我不知道。谢谢!还可以看看这个:@golergka-Huh?
@autoreleasepool{}
明确用于ARC:Aye:D…我现在建议了三个选项。旧方法;从ARC中排除并使用旧方法声明池。新方法;使用@autoreleaspool.Hard-way;使用CoreFoundation而不使用自动删除。