В C, goto
только работы в рамках текущей функции, которая имеет тенденцию локализовать любые потенциальные ошибки. setjmp
и longjmp
намного более опасны, будучи нелокальным, сложным и зависящим от реализации. На практике однако они являются слишком неясными и редкими для порождения многих проблем.
я полагаю, что опасность goto
в C значительно преувеличена. Помните, что исходные goto
аргументы произошли назад в эпоху языков как ОСНОВНОЙ старомодный, где новички запишут запутанный код как это:
3420 IF A > 2 THEN GOTO 1430
Здесь Linus описывает соответствующее использование goto
: http://www.kernel.org/doc/Documentation/CodingStyle (глава 7).
Если вы пишете такой код:
- (void) doStuff
{
[activityIndicator startAnimating];
...lots of computation...
[activityIndicator stopAnimating];
}
Вы не даете пользовательскому интерфейсу время чтобы фактически запустить и остановить индикатор активности, потому что все ваши вычисления выполняются в основном потоке. Одно из решений - вызвать startAnimating в отдельном потоке:
- (void) threadStartAnimating:(id)data {
[activityIndicator startAnimating];
}
- (void)doStuff
{
[NSThread detachNewThreadSelector:@selector(threadStartAnimating:) toTarget:self withObject:nil];
...lots of computation...
[activityIndicator stopAnimating];
}
Или вы можете поместить свои вычисления в отдельный поток и дождаться его завершения перед вызовом stopAnimation.
Обычно я делаю:
[activityIndicator startAnimating];
[self performSelector:@selector(lotsOfComputation) withObject:nil afterDelay:0.01];
...
- (void)lotsOfComputation {
...
[activityIndicator stopAnimating];
}
Хорошо, извините, кажется, я просмотрел свой код, будучи слепым.
Я закончил индикатор вот так:
[activityIndicator removeFromSuperview];
activityIndicator = nil;
Итак, после одного прогона активностьIndicator была полностью удалена.