应用程序崩溃并显示消息 "terminated due to memory error"

App crashed with message "terminated due to memory error"

我有一个函数可以将我的数组转换为字符串,当我 运行 这个函数用于长度为 50000 的数组时,我的应用程序崩溃并且消息说由于内存错误而终止。下面是我的函数。

-(NSString*)getStringFromArray:(NSMutableArray*)array
{
    NSString* resultantString = [array objectAtIndex:0];
    for (int i = 1; i < [array count]; i ++)
    {
        resultantString = [NSString stringWithFormat:@"%@ %@", resultantString, [array objectAtIndex:i]];
    }
    return resultantString;
}

您可以尝试使用 NSMutableString instead multiples NSString, so at end convert to NSString

类似的东西:

-(NSString*)getStringFromArray:(NSMutableArray*)array
{
    //NSString* resultantString = [array objectAtIndex:0];
    NSMutableString * buffer = [[NSMutableString alloc] init];
    for (int i = 0; i < [array count]; i ++)
    {
        //resultantString = [NSString stringWithFormat:@"%@ %@", resultantString, [array objectAtIndex:i]];
        [buffer appendString:[array objectAtIndex:i]];
    }

    NSString *resultantString = [[buffer copy] autorelease];
    return resultantString;
}

代码没有被检查,因为我没有 mac 去做那个,但这就是想法

希望对您有所帮助

检查您的字符串末尾有多少个字符:NSString 可以容纳超过 42 亿个字符。

您可能正在尝试创建超过字符限制的 NSString。

快速计算:数组中每个条目大约 85 个字符。

在如此大的循环中没有足够的时间释放您正在使用的内存。

您可以使用自动释放池:

@autoreleasepool {
           resultantString = [NSString stringWithFormat:@"%@ %@", resultantString, [array objectAtIndex:i]];
}

或使用不同的策略:

resultantString = [resultantString stringByAppendingString:[array objectAtIndex:i]];

这将导致崩溃和巨大的内存峰值: 进一步评论:

NSString* sourceString = @"";
for (int i = 1; i < 50000; i ++)
{
    sourceString = [NSString stringWithFormat:@"%@ %@", sourceString, @"foo"];

}

这不会:

NSString* sourceString = @"";
for (int i = 1; i < 50000; i ++)
{
    sourceString = [sourceString stringByAppendingString:@"foo"];
}

您正在创建 50,000 个长度巨大的自动释放字符串。那么你期待什么?您正在滥用 autorelease 的用途。

用 [[NSString alloc] initWithFormat...] 替换 [NSString stringWithFormat:...] 会有很大帮助。如果您不明白有什么区别,那么您真的需要回到基础知识并了解自动释放的含义。

显然这仍然非常低效。使用 NSMutableString 要好得多。甚至更好地使用 NSArray componentsJoinedByString 的内置方法。

我错过了什么吗? (这不是一个好问题。)您只是想连接数组的元素吗?

Foundation 有一个方法可以做到这一点:

-(NSString*)getStringFromArray:(NSMutableArray*)array {
    return [array componentsJoinedByString:@" "];
}