В вашей функции:
- (void)spinEnd {
[indicator stopAnimating];
self.indicator = nil;
}
Я бы предложил не устанавливать индикатор на ноль. Действительно, установка self.indicator = nil
сделает индикатор разблокированным. Если это также вызывает освобождение, возможно, что пользовательский интерфейс не будет в состоянии правильно перерисовать себя при выполнении основного цикла. Обратите внимание: это всего лишь гипотеза, которую я выдвигаю из-за странного поведения, которое вы ведете. Это может работать или не может.
Я также хотел бы убедиться, что hidesWhenStopped
установлен на YES
, когда индикатор остановлен. В общем, я бы переписал:
- (void)spinEnd {
self.indicator.hidesWhenStopped = YES; //-- additional guarantee, but it should already be set
[indicator stopAnimating];
}
и отпустите indicator
в вашем -dealloc
:
- (void)dealloc {
....
[_indicator release];
_indicator = nil;
...
[super dealloc];
}
Кстати, также исправьте утечку памяти в initSpinner
:
- (void)initSpinner {
self.indicator = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge] autorelease];
....
Следует отметить, что при выполнении initSpinner
, если indicator
уже был там, назначение нового UIActivityIndicatorView
для self.indicator
приведет к освобождению предыдущего.
EDIT:
Если ни один из вышеперечисленных способов не работает, вы можете попробовать еще две вещи:
установка для свойства индикатора hidden
значения YES в -spinEnd
;
возможно, я ошибался, но мне кажется, что установка self.indicator.hidesWhenStopped = YES
может быть более эффективной перед вызовом [indicator stopAnimating];