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 占用大量内存的主要内容,如果未能解决你的问题,请参考以下文章