Цикл For влияет на целостность NSString?

#objective-c

#objective-c

Вопрос:

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

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

 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
}
  

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

Комментарии:

1. Какую обратную трассировку вы получаете при сбое приложения?

Ответ №1:

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

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

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

Ответ №2:

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

 int r;
theString = [NSMutableString string];

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

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

Ответ №3:

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

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

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

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

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