проблема с многопоточностью (EXC_BAD_ACCESS) - PullRequest
0 голосов
/ 29 марта 2010

следующий код вызывает сбой приложения, и я не знаю почему. Это происходит сбой нерегулярно, это означает, что иногда при просмотре строки может отображаться изображение, например, 30 раз, иногда при выборе строки происходит сбой во второй раз.

FYI: индикатор активности, лист действий и переменная imageNr определены глобально и будут инициализированы в методе viedDidLoad.

Заранее спасибо за советы.
Шон

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
 imageNr = indexPath.row + 1;
 activityLoadView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(-17.5, -11, 35, 35)];
                    activityLoadView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhiteLarge;
                    activityLoadView.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
                                                        UIViewAutoresizingFlexibleRightMargin |
                                                        UIViewAutoresizingFlexibleTopMargin |
                                                        UIViewAutoresizingFlexibleBottomMargin);

 actionSheetLoadView = [[UIActionSheet alloc] initWithTitle:@""
                                                   delegate:self
                                          cancelButtonTitle:nil
                                     destructiveButtonTitle:nil
                                          otherButtonTitles:nil];
 actionSheetLoadView.actionSheetStyle = UIBarStyleBlackOpaque;

 [actionSheetLoadView setMessage:[NSString stringWithFormat:@"\n\n\n\n\n\n\n\n\n\n\n\n\nLoading image ..."]];
 [actionSheetLoadView addSubview:activityLoadView];
 [actionSheetLoadView showInView:self.view];
 [actionSheetLoadView setBounds:CGRectMake(0,0,320,720)];

 [activityLoadView performSelector:@selector(startAnimating) withObject:nil afterDelay:0.1];
 [self performSelectorInBackground:@selector(showImageView) withObject:nil];
}

- (void)showImageView
{
  [self setViewInfo];
  [self.navigationController pushViewController:imageViewController animated:YES];

  [activityLoadView performSelector:@selector(stopAnimating) withObject:nil afterDelay:0.1];
  [actionSheetLoadView dismissWithClickedButtonIndex:0 animated:YES];
  [activityLoadView release];
  [actionSheetLoadView release];
}

1 Ответ

1 голос
/ 29 марта 2010

Помимо прочего, вы выполняете обновления пользовательского интерфейса в фоновом потоке (запустив -showImageView в фоновом режиме). Элементы интерфейса пользователя не являются поточно-ориентированными на iPhone OS и должны обновляться в основном потоке. Практически все, что делается в методе -showImageView, должно выполняться в основном потоке (с возможным исключением -setViewInfo, в зависимости от того, что это делает).

Кроме того, будьте очень осторожны при освобождении объектов в фоновом потоке, поскольку они могут использоваться в основном потоке (или другом), что может привести к сбоям.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...