NSString переполняет свой буфер и приложение не работает. Отладчик не видит никакой информации трассировки стека. Но почему? - PullRequest
1 голос
/ 28 марта 2012

Я потратил много времени, чтобы выяснить причину сбоя моего приложения.Моя переменная count в некоторых случаях не инициализируется должным образом.

NSString переполняет свой буфер и приложение не работает.Отладчик не видит никакой информации трассировки стека.Но почему?

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

ОБНОВЛЕНИЕ: Почему отладчик не показывает информацию трассировки стека?

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Вы не только создаете длинные строки, вы создаете много строк.Каждый вызов +stringWithFormat: создает новую строку, которая на один символ ('\n') длиннее предыдущей.Эти строки автоматически высвобождаются, но пул автоматического выпуска никогда не истощается, поэтому вы заполняете память большим количеством строк, таких как @"\n", @"\n\n", @"\n\n\n", @"\n\n\n\n" и так далее.Скорее всего, вы выйдете из строя задолго до того, как достигнете любого предела внутреннего размера буфера (если он есть) в NSString.

1 голос
/ 28 марта 2012

Используйте это, чтобы узнать, как далеко вы доберетесь:

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]);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...