【发布时间】:2025-12-12 01:50:02
【问题描述】:
我正在寻找有关如何改进使用 base64 编码解码 40+MB NSString 并将其保存到文件的过程的想法,同时能够将该过程适应 iPad 1 的 256 MB RAM
我从 NSXMLParser 得到 NSString:
id pointerToString;
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
if ([currentElement isEqualToString:@"myElement"])
{
pointerToString = [string retain];
}
}
然后我在回调中使用pointerToString:
[handler performSelector: action withObject: pointerToString];
在回调中(id 值是pointerToString)。我用pointerToString初始化NSData,同时用base64编码解码它。
^(id value)
{
if ( [[value class] isSubclassOfClass:[NSString class]] )
{
NSData *data = [NSData dataFromBase64String:value];
[data writeToFile:file.path atomically:YES];
}
}
在 NSData 调用之后或期间,当内存分配达到大约 130MB 时,iPad 1 设备内存不足并被 iOS 杀死。
我已经确定,为了以这种方式处理 40+MB 的 NSString,我需要大约 180+MB 的 RAM(这是 iPad 2 和 3 上的最大内存分配,该过程在其中工作是因为更多内存)
有什么想法/提示吗?
谢谢
【问题讨论】:
-
我不知道,但这是一个很好的问题。不过,我想知道为什么你的 NSString 这么大?
-
修改 base64 编码以在您从解析器接收字符时将字符解码为文件。
-
关键字:“流式传输”(整个过程,这还涉及到删除
NSData的全部内存使用) -
看来您实际上是在尝试解码 base64 字符串。
-
iPad1 上通常有大约 140mb 的可用 RAM - 通常更少。是的,我把它弄混了——iPad 1 确实有 256mb 共享 RAM。很多都被操作系统和屏幕使用。
标签: ios xml memory-management base64 nsdata