我有以下代码:
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 错误。
有什么方法可以解决此对象在释放之前两次存储在内存中的问题吗?
我计划用 while 循环替换 for 循环,从 splitHtml 中删除已处理的 NSString。当 splitHtml 为空时,循环条件满足。这样,当 parts 数组消耗更多内存时, splitHtml 数组消耗更少的内存。我是否需要释放每个 NSString 或者我可以删除它并让数组整体消耗更少的内存?
Thanks,
Joe
使用解析 HTMLrangeOfString:
, NSScanner
或者正则表达式是徒劳的。它可能适用于您的测试用例,但一旦 HTML 发生更改,它就会崩溃。
IE。请记住:
<div class=\"endofsections\">
And:
<div class=\"endofsections\" id=1
title="End Of Sections" >
两者在以下方面相同class
属性。
使用适当的 HTML 解析器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)