ARC 占用大量内存

Posted

技术标签:

【中文标题】ARC 占用大量内存【英文标题】:Huge memory footprint with ARC 【发布时间】:2012-06-12 00:29:39 【问题描述】:

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

        ...

    

    ...


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

【问题讨论】:

请贴出与您的问题相关的代码 @mdvs 它不容易被谷歌搜索;你能提供一个链接到你在说什么吗? 【参考方案1】:

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

while(!done) 

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

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

【讨论】:

如果我建议的方法对您不起作用(由于我不知道将特定实现文件标记为从 ARC 中排除的原因是标准功能),请考虑使用不同的方法来读取数据- 例如核心基金会CFReadStreamRead. “标记要从 ARC 中排除的特定实现文件是一项标准功能”,看来我的答案就在那里。我其实并不知道。谢谢! 也看看这个:joel.lopes-da-silva.com/2010/09/07/… @golergka 嗯? @autoreleasepool 明确用于 ARC:developer.apple.com/library/mac/#documentation/Cocoa/Reference/… Aye :D ...我现在提出了三个选项。老办法;从 ARC 中排除并使用旧的声明池的方式。新方法;使用@autorelaspool。艰辛的道路;使用 CoreFoundation 而不自动释放。

以上是关于ARC 占用大量内存的主要内容,如果未能解决你的问题,请参考以下文章

WebBrowser1占用大量内存解决办法

C#管理大量耗时的线程,内存占用严重

Lsass.exe进程占用大量内存

空闲的 postgres 进程占用大量内存

进程过多,占用大量内存,如何分析

使用文件管理器迭代目录占用大量内存