Objective c 将NSString拆分为子字符串的最节省内存的方法

Objective c 将NSString拆分为子字符串的最节省内存的方法,objective-c,ios,Objective C,Ios,我有以下代码: int start = [html rangeOfString:@"class=WordSection1>"].location + 24; int end = [html rangeOfString:@"<div class=\"endofsections\">"].location; self.parts = [[NSMutableArray alloc] init]; NSString* startHtml = [html

我有以下代码:

    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];
int start=[html rangeOfString:@“class=WordSection1>”。位置+24;
int end=[html rangeOfString:@''。位置;
self.parts=[[NSMutableArray alloc]init];
NSString*startHtml=[html substringToIndex:start-1];
NSString*mainHtml=[html substringWithRange:NSMakeRange(start-1,end-start-1)];
NSString*endHtml=[html substringfromfromindex:end];
// !! 此时,我们在内存中有两次字符串
[html版本];
[self.parts addObject:startHtml];
NSArray*splitHtml=[mainHtml组件由字符串分隔:@“

”;


//[主要HTML版本] 嗯。。您不能释放mainHtml,因为它是作为自动释放对象创建的,所以在您的函数完成后将调用release,如果该对象在此之前已经释放,它将崩溃


您可以尝试创建一个额外的函数来拆分字符串并返回数组,可能还有一个自己的自动释放池,在函数运行后释放该池以确保字符串被释放。

使用
rangeOfString:
NSScanner
或正则表达式解析HTML是徒劳的。它可能适用于您的测试用例,但一旦HTML发生变化,它就会崩溃

即,记住:

<div class=\"endofsections\">

以及:


属性而言,两者都是相同的


使用合适的HTML解析器。

是的,通常人们可以编写各种疯狂的HTML,但此HTML是一个word文档,已由我们的客户保存为HTML。Word有自己的专有模式,并以相当标准的方式输出HTML。HTML可能会每一两年改变一次,但当它改变时,我们会意识到这一点,并将推出新的版本*编辑endofsections不是word保存的HTML文档中通常可以找到的东西——我自己补充道,HTML中的“遵循标准”既不需要稳定的空白输出,也不需要保留标记中的key=value对。如果你构建一个依赖于其中任何一个的解析器,它都会崩溃。我必须同意@bbum的观点。使用一个真正的HTML解析器会让你省去很多麻烦。是的,但是HTML不会改变。如果它真的发生了变化,那么我将不得不对它进行大量修改。endofsections div是我自己添加的东西。如果我必须再加一次的话,我不会使用任何有趣的空格等。嗯。。。。是 啊“HTML永远不会改变”。我以前听说过。:)关键是HTML可以改变,而不会真正改变意思。啊,谢谢。我现在这样做一个retain和release:`NSString*mainHtml=[[html substringWithRange:NSMakeRange(start-1,end-start-1)]retain];NSArray*splitHtml=[mainHtml组件由字符串分隔:@“

”;[mainHtml发布];`这是正确的做法吗?由于某种原因,这似乎会使仪器崩溃,因此我看不到实际的内存使用情况。

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