NSString溢出其缓冲区和应用程序崩溃。调试器没有看到任何堆栈跟踪信息。但为什么?

时间:2012-03-28 11:21:48

标签: ios nsstring

我花了很多时间来找出我的应用崩溃的原因。在某些情况下,我的count变量未正确初始化。

NSString溢出其缓冲区和应用程序崩溃。调试器没有看到任何堆栈跟踪信息。但为什么?

int count = 2147483647;
NSString *lines = @"";
for(int i = 0; i < count; i ++)
{
    lines = [NSString stringWithFormat:@"%@%@", lines, @"\n"];
}

更新:为什么调试器不显示任何堆栈跟踪信息?

2 个答案:

答案 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]);
    }
}