#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
.