我花了很多时间来找出我的应用崩溃的原因。在某些情况下,我的count变量未正确初始化。
NSString溢出其缓冲区和应用程序崩溃。调试器没有看到任何堆栈跟踪信息。但为什么?
int count = 2147483647;
NSString *lines = @"";
for(int i = 0; i < count; i ++)
{
lines = [NSString stringWithFormat:@"%@%@", lines, @"\n"];
}
更新:为什么调试器不显示任何堆栈跟踪信息?
答案 0 :(得分:2)
您不仅要创建长字符串,还要创建大量字符串。每次调用+stringWithFormat:
都会创建一个新字符串,该字符串比之前的字符长一个字符('\n'
)。这些字符串是自动释放的,但自动释放池永远不会耗尽,所以你要用很多字符串填充内存,如@"\n"
,@"\n\n"
,@"\n\n\n"
,@"\n\n\n\n"
和等等。在NSString中达到任何内部缓冲区大小限制(如果有)之前,您可能会崩溃。
答案 1 :(得分:1)
使用它来了解你得到了多远:
int count = 2147483647;
NSString *lines = @"";
for (int i = 0; i < count; i++) {
@try {
lines = [lines stringByAppendingString:@"\n"];
}
@catch (NSException *ex) {
NSLog(@"end after %d loops (%@)", i, [ex description]);
}
}