Ios NSString溢出其缓冲区,应用程序崩溃。调试器不';看不到任何堆栈跟踪信息。但是为什么呢?

Ios NSString溢出其缓冲区,应用程序崩溃。调试器不';看不到任何堆栈跟踪信息。但是为什么呢?,ios,nsstring,Ios,Nsstring,我花了很多时间来找出我的应用程序崩溃的原因。我的count变量在某些情况下没有正确初始化 NSString溢出其缓冲区,应用程序崩溃。调试器未看到任何堆栈跟踪信息。但是为什么呢 int count = 2147483647; NSString *lines = @""; for(int i = 0; i < count; i ++) { lines = [NSString stringWithFormat:@"%@%@", lines, @"\n"]; } int count=2

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

NSString溢出其缓冲区,应用程序崩溃。调试器未看到任何堆栈跟踪信息。但是为什么呢

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

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

您不仅创建了长字符串,还创建了大量字符串。每次调用
+stringWithFormat:
都会创建一个比以前长一个字符的新字符串(
'\n'
)。这些字符串是自动释放的,但自动释放池永远不会耗尽,因此您正在用大量字符串填充内存,例如
@“\n”
@“\n\n”
@“\n\n”
@”\n\n”
,等等。在NSString中达到任何内部缓冲区大小限制(如果有)之前,您可能就已经崩溃了。

使用此选项可以了解您达到了多少:

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]);
    }
}
int count=2147483647;
NSString*行=@“”;
for(int i=0;i
debugger为什么不显示任何堆栈跟踪信息?IIRC my math lessons,假设1个字符==1个字节,则在排空自动释放池之前,内存中需要(n*(n-1))/2个字节。因为n大约是2e9,所以需要1e18字节的RAM,也就是说。。。一个EB。别做梦了:)我在设备上运行了这段代码,但试试看,catch不起作用。我没有任何异常,我的应用程序崩溃了。好的,它没有捕获到它,但我得到一个错误:**mmap(大小=16777216)失败(错误代码=12)***错误:无法分配区域。你在Xcode的调试区域没有看到这个?我使用的是Xcode 4.1。我没有发现任何错误。你的XCode版本是什么?