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