Не используйте sleep()
для выполнения действий после задержки, это блокирует весь поток.Вместо этого используйте performSelector:withObject:afterDelay:
.Поскольку вы, вероятно, выполняете это в главном потоке, sleep()
будет блокировать любые обновления пользовательского интерфейса до тех пор, пока не завершится весь цикл, поэтому вы видите только последнее обновление.Как общее практическое правило, предположим, что пользовательский интерфейс никогда не обновляется, пока приложение не завершит выполнение вашего метода.
Не следует использовать %s
в качестве спецификатора формата для NSString
это спецификатор формата для строки C.Вы должны использовать %@
вместо этого.Фактически, если все, что вы делаете, это инициализируете строку с литералом NSString
, вам вообще не нужно использовать initWithFormat
, вы можете просто использовать сам литерал.
У вас также есть большойпроблемы с памятью.В начале цикла вы выделяете память для экземпляра NSString
, который представляет собой один пробел.Затем вы перезаписываете указатель на эту память при повторном присвоении tempStr
, что означает утечку исходного выделения памяти. Построить и проанализировать найдет подобные проблемы для вас.Затем вы отпускаете tempStr
, но, поскольку второе присваивание этой переменной-указателю было автоматически выпущено NSString
, экземпляр будет освобожден один раз слишком много, когда пул авто-выпуска истощается, что, вероятно, проявится как сбой, который невозможендля отладки чуть позже в приложении.
Я бы сделал что-то вроде этого:
- (void)showRandomColourAfterDelay {
static NSUInteger count = 0;
switch (arc4random()%3) {
case 0:
labelsText.text = @"Red";
case 1:
labelsText.text = @"Blue";
case 2:
labelsText.text = @"Green";
}
count++;
if (count >= 3) return;
[self performSelector:@selector(showRandomColourAfterDelay) withObject:nil afterDelay:3];
}
На самом деле, я бы, вероятно, использовал NSArray
для хранения строк цвета,но это повлечет за собой изменения за пределами одного метода, поэтому я придерживаюсь вашего подхода жесткого программирования.