Для цикла влияет на целостность NSString? - PullRequest
0 голосов
/ 02 ноября 2011

Не уверен, почему один фрагмент работает, а другой отказывает:

Это происходит сбой (приложение закрывается) после трехкратного нажатия кнопки (этот отсканированный код выполняется при «нажатии кнопки»):

sUser = [NSString stringWithFormat: @"%@ %c", sUser, charcode];//appendstring

Примечание: в заголовочном файле sUser определен как NSString, а charcode - это int;

Это работает (этот фрагмент кода выполняется при «нажатии кнопки»):

int r;
theString = @"";

for(i = 0; i < iDigits ; i++)
{
    r = rand() % 26;
    theString = [NSString stringWithFormat: @"%@ %c", theString, r + 65];//appendstring
}

Примечание: в заголовочном файле theString определяется как NSString;

Ответы [ 3 ]

1 голос
/ 02 ноября 2011

В первом примере вы создаете автоматически выпущенную строку, которая будет освобождена при повторном нажатии кнопки. Во втором примере вы делаете все за один цикл, что означает, что пул авто-релиза не сливается.

Если sUser является сохраняемым свойством, первая выборка должна быть

self.sUser = [NSString stringWithFormat: @"%@ %c", sUser, charcode];
1 голос
/ 02 ноября 2011

Вы присваиваете новую строку для theString каждый раз через цикл.Если вы хотите изменить существующую строку, вам следует использовать NSMutableString и -appendString: или -appendFormat: вместо этого, например:

int r;
theString = [NSMutableString string];

for(i = 0; i < iDigits ; i++)
{
    r = rand() % 26;
   [theString appendFormat: @"%c", r + 65];
}

Редактировать: Извините, я забыл ответитьактуальный вопрос, который спрашивает, почему первый фрагмент не работает.У jrturton есть правильный ответ: вы не сохраняете строку.Поскольку строка автоматически освобождается, она будет освобождена и освобождена, если вы не сохраните ее.То же самое относится и к приведенному выше коду - если вы планируете сохранить полученную строку, вам нужно ее сохранить.

0 голосов
/ 02 ноября 2011

Причиной сбоя является то, что если в заголовке определен sUser, это означает, что он принадлежит вашему классу и его необходимо назначить сохраненной строке.Если у вас есть свойство для sUser, сделайте это

self.sUser = [NSString stringWithFormat: @"%@ %c", sUser?:@"", charcode];

в противном случае

NSString *temp = [NSString stringWithFormat: @"%@ %c", sUser?:@"", charcode];
[sUser release];
sUser = [temp retain];

Теперь есть более эффективный способ добавления строк NSMutableString.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...