OStack程序员社区-中国程序员成长平台

标题: objective-c - 将 NSString 拆分为子字符串的最节省内存的方法 [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 09:07
标题: objective-c - 将 NSString 拆分为子字符串的最节省内存的方法

我有以下代码:

    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-推荐答案


使用 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/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4