如何修复长NSString崩溃?

Ata*_*a01 4 crash objective-c nsstring

在我正在研究的应用程序中,我正在从for循环中的文本文件中读取数值,然后进行一些计算并将结果附加到结果字符串.

该文件中包含22050个值.我注意到,超过一定数量的循环/值附加(~5300)它往往会崩溃.

我想也许我有一个内存泄漏,所以我摆脱了附加的字符串,一切正常.我试图摆脱一切,但字符串附加和应用程序崩溃.我对所有异常都有一个断点,我没有任何异常.

我想确保我开始一个新项目.所有我放在那里的是一个UIButton,推送时调用这段代码:

- (IBAction)TestPressed:(id)sender
{
    NSString *testString = @"";

    for (int i = 0; i < 22050; i++)
    {
        testString = [testString stringByAppendingString:@"12.34567890\n"];
    }

    NSLog(@"%@", testString);
}
Run Code Online (Sandbox Code Playgroud)

我在NSLog线上有一个断点.该应用程序之前崩溃了.

NSString长度有限制吗?它是否使用了太多内存?

Nik*_*uhe 13

问题是您在每次迭代中都创建了一个新字符串.有两种方法可以解决这个问题:使用可变字符串来创建结果:

NSMutableString *testString = [NSMutableString string];

for (int i = 0; i < 22050; i++)
{
    [testString appendString:@"12.34567890\n"];
}

NSLog(@"%@", testString);
Run Code Online (Sandbox Code Playgroud)

...或使用自动释放池删除循环中的实例:

NSString *testString = @"";

for (int i = 0; i < 22050; i++)
{
    @autoreleasepool {
        testString = [testString stringByAppendingString:@"12.34567890\n"];
    }
}

NSLog(@"%@", testString);
Run Code Online (Sandbox Code Playgroud)

请注意,我仅包含第二个版本,以说明问题首先出现的原因以及如何解决问题.它仍然是低效的,因为它创建了22049个临时字符串,平均长度为120,000个字符.