大多数内存有效的方式将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器。
- 编译器不喜欢使用Swift的UIScrollViewDelegate
- ShouldChangeTextInRange不被UITextView调用
- iOS:使用sizeWithFont的UILabeldynamic高度:constrainedToSize:lineBreakMode:不工作
- Xamarin Live Player…第1卷
- iOS Swift 3:将“yyyy-MM-dd'T'HH:mm:ssZ”格式的string转换为date对象
- parsingiOS SDK:奇怪“无法做比较查询的types:(NULL)”
- iOS中的远程通知和安静通知有什么区别?
- AudioContext.createMediaStreamSource替代iOS?
- 如何改变UIPageViewController分页curlanimation的方向