#iphone #crash #uiviewanimation
#iPhone #сбой #uiviewanimation
Вопрос:
Приложение вылетает очень редко. Однажды произошел сбой, и я получил следующий отчет:
[UIViewAnimationState release]:message sent to deallocated instance
Я не могу найти, где это используется. Я не использую никаких анимаций в своем коде. Что может быть причиной сбоя?
я подозреваю, что это код, в котором происходит сбой
-(void)showMessageSendingIndicator
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
self.av1=[[UIAlertView alloc] initWithTitle:@"Sending Message, please wait..." message:@"" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
UIActivityIndicatorView *ActInd=[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[ActInd startAnimating];
[ActInd setFrame:CGRectMake(125, 60, 37, 37)];
[self.av1 addSubview:ActInd];
[self.av1 show];
[pool release];
return;
}
Комментарии:
1. опубликуйте журнал сбоев вместе с кодом, в котором программа застряла
2. единственное сообщение о сбое, которое я получил, было [Выпуск UIViewAnimationState]: сообщение, отправленное освобожденному экземпляру
Ответ №1:
Во-первых, вы устанавливаете av1
на сохраненный объект. Замените эту строку чем-то вроде этого:
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Sending Message, please wait..." message:@"" delegate:self cancelButtonTitle:nil otherButtonTitles:nil];
self.av1 = alert;
[alert release];
Во-вторых, вы никогда не выпускаете ActInd
. Добавьте [ActInd release]
перед [pool release]
. Это безопасно, потому что av1
сохраняется при вызове addSubview:
Почему на боковом узле NSAutoreleasePool
? Обычно они нужны в отдельном потоке, но отображение индикатора активности должно выполняться в основном потоке.
А также, если вы хотите следовать каким-либо соглашениям, вам следует заменить ActInd
на actInd
.
Комментарии:
1. да, я вызываю это в отдельном потоке. сначала я показывал это в основном потоке, но затем потребовалась некоторая задержка, прежде чем всплывет alertview (плохой пользовательский интерфейс). теперь, когда я использую ее в отдельном потоке, это происходит почти мгновенно.
2. Рекомендуется выполнять все операции пользовательского интерфейса в главном потоке. Начиная с версии 4.0, UIKit теперь в основном потокобезопасен, но по-прежнему идеально, чтобы все, что изменяет ваш пользовательский интерфейс, выполнялось в основных, а не во вторичных потоках.