应用程序崩溃并显示消息 "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:@" "];
}
我有一个函数可以将我的数组转换为字符串,当我 运行 这个函数用于长度为 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:@" "];
}