выпуск uiviewanimationstate. программа аварийно завершает работу случайным образом

#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 теперь в основном потокобезопасен, но по-прежнему идеально, чтобы все, что изменяет ваш пользовательский интерфейс, выполнялось в основных, а не во вторичных потоках.