• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 09:07:06 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有以下代码:

    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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap