大多数内存有效的方式将NSString拆分为子string

我有以下代码:

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并将子string分配给一个叫做splitHtml的NSArray,这又意味着它们被存储在内存中两次。 我尝试释放mainHtml,但这会导致EXC_BAD_ACCESS错误。

有什么办法解决这个对象被存储在内存两次之前被释放的问题?

我打算用一个while循环replacefor循环,从splitHtml中移除已处理的NSString。 splitHtml为空时将满足循环条件。 这是因为,部分数组消耗更多的内存splitHtml数组消耗更less的内存。 我是否需要释放每个NSString,或者我可以删除它,并让数组占用更less的内存?

谢谢,

那么..你不能释放mainHtml,因为它是作为一个autorelease对象创build的,所以释放将在你的函数完成后被调用,并且如果这个对象已经被释放,它将会崩溃。

您可以尝试创build一个额外的函数来分割string并返回数组,可能是在您运行该函数后释放一个自己的自动释放池,以确保释放string。

使用rangeOfString:parsingHTML rangeOfString:NSScanner或正则expression式是徒劳的。 它可能适用于你的testing用例,但是一旦HTML改变就会中断。

请记住:

 <div class=\"endofsections\"> 

和:

 <div class=\"endofsections\" id=1 title="End Of Sections" > 

两者在class属性方面是相同的。

使用适当的HTMLparsing器。