应用程序崩溃,消息“由于内存错误而终止”

时间:2015-01-22 12:20:07

标签: objective-c iphone arrays xcode6

我有一个函数将我的数组转换为字符串,当我为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;
}

5 个答案:

答案 0 :(得分:0)

您可以尝试使用NSMutableString代替NSString,因此最后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中这样做,但这就是想法

我希望这会有所帮助

答案 1 :(得分:0)

检查你的字符串最后会有多少个字符:NSString可以容纳超过42亿个字符。

您可能正在尝试在字符数限制上创建NSString。

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

答案 2 :(得分:0)

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

您可以使用自动释放池:

@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"];
}

答案 3 :(得分:0)

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

用[[NSString alloc] initWithFormat ...]替换[NSString stringWithFormat:...]将有很大帮助。如果你不了解其中的区别,那么你真的需要回到基础并了解autorelease的含义。

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

答案 4 :(得分:0)

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

基金会有一种方法可以做到这一点:

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