尝试替换 NSString 中的多个字符串实例时内存使用过多

Too much memory usage when trying to replace many instances of a string in an NSString

我必须在循环中从另一个字符串中删除字符串。这个

我遇到了巨大的内存泄漏
[_withString1a setString:[_withString1a stringByReplacingOccurrencesOfString:fix1 withString:@""]];
[_withString1a setString:[_withString1a stringByReplacingOccurrencesOfString:fix2 withString:@""]];

我也试过了

[_withString1a setString:[[NSRegularExpression regularExpressionWithPattern:fix1 options:NSRegularExpressionCaseInsensitive error:nil] stringByReplacingMatchesInString:_withString1a options:0 range:NSMakeRange(0, [_withString1a length]) withTemplate:@""]];
                  [_withString1a setString:[[NSRegularExpression regularExpressionWithPattern:fix2 options:NSRegularExpressionCaseInsensitive error:nil] stringByReplacingMatchesInString:_withString1a options:0 range:NSMakeRange(0, [_withString1a length]) withTemplate:@""]];

我在一个循环中有这个,正弦在每次迭代中变量修复是不同的并且 stringByReplacingOccurrencesOfString 导致内存泄漏 +0.5mb/迭代。 _withString1a 是 0.5mb 文件。 1k 循环后应用程序崩溃。

有什么想法吗?

您可能没有遇到内存泄漏,只是在循环中累积了自动释放的字符串。在替换操作周围添加一个自动释放池:

for (...) {
    @autoreleasepool {
        _withString1a = [_withString1a stringByReplacingOccurrencesOfString:fix1 withString:@""]];
    }
}

使用 autoreleasepool 每次迭代都会删除临时自动释放的内存。

您可以在自动释放池中放置多个语句。

你完全错了。

您不必在循环中从另一个字符串中删除字符串。你认为你必须这样做,因为你想不出更聪明的东西,但你不必这样做。即使您设法避免了自动释放内存的浪费,您的操作仍然非常缓慢。

创建一个 NSMutableString。然后找到要删除的第一个项目的位置,并将字符串开头的字符附加到第一个项目。然后找到要删除的第二个项目的位置,在第一个项目结束后开始搜索,并将中间的字符附加到可变字符串。等等。