我有以下代码:
int start = [html rangeOfString"class=WordSection1>"].location + 24;
int end = [html rangeOfString"<div class=\"endofsections\">"].location;
self.parts = [[NSMutableArray alloc] init];
NSString* startHtml = [html substringToIndex:start - 1];
NSString* mainHtml = [html substringWithRange:NSMakeRange(start - 1, end - start - 1)];
NSString* endHtml = [html substringFromIndex:end];
// !! At this point we have the string in memory twice
[html release];
[self.parts addObject: startHtml];
NSArray *splitHtml = [mainHtml componentsSeparatedByString"<p class=NumberedParagraph>"];
//[mainHtml release]; <-- this causes bad access errors. Does the split do a copy or does it just create a new set of pointers but use the same memory?
for(NSString* part in splitHtml){
if (first){
[self.parts addObject: part];
first = NO;
} else {
[self.parts addObject: [NSString stringWithFormat"<p class=NumberedParagraph>%@", part]];
}
}
[self.parts addObject:endHtml];
这个问题是 html 大约是 20Mb。我将其拆分为 startHtml、mainHtml 和 endHtml。拆分后,我然后发布 html。但是在此版本之前,所有 4 个 NSString 都在内存中,因此应用程序使用了额外的 40Mb 左右。
然后我拆分 mainHtml 并将子字符串分配给一个名为 splitHtml 的 NSArray,这再次意味着它们在内存中存储了两次。我尝试释放 mainHtml 但这会导致 EXC_BAD_ACCESS 错误。
有没有办法绕过这个对象在被释放之前两次存储在内存中的问题?
我计划将 for 循环替换为 while 循环,该循环从 splitHtml 中删除已处理的 NSString。当 splitHtml 为空时,将满足循环条件。这样一来,随着parts 数组消耗更多内存,splitHtml 数组消耗更少内存。我需要释放每个 NSString 还是可以将其删除并让整个数组消耗更少的内存?
谢谢,
乔
Best Answer-推荐答案 strong>
使用 rangeOfString: 、NSScanner 或正则表达式解析 HTML 是徒劳的。它可能适用于您的测试用例,但一旦 HTML 更改它就会中断。
即请记住:
<div class=\"endofsections\">
还有:
<div class=\"endofsections\" id=1
title="End Of Sections" >
两者在 class 属性方面是相同的。
使用适当的 HTML 解析器。
关于objective-c - 将 NSString 拆分为子字符串的最节省内存的方法,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/7390226/
|