2014-11-08 4 views
0

У меня возникла проблема с моим текущим проектом.EXC_BAD_ACCESS на свойство управляемого объекта

Целью является загрузка pdf-файла и его отображение в UIPageViewController. Пользователь может просматривать доступные pdf-файлы через UICollectionView, который обслуживается данными NSFetchedResultsController.

Если кнопка чтения запускается, управляемый объект передается в ViewController, который проверяет, загружен ли pdf-файл или загружен ли он, и затем отображает его.

Этот код отвечает за загрузку нового контроллера просмотра и передачу ему управляемого объекта.

- (IBAction)readNowButtonPressed:(UIButton *)sender 
{ 

    UICollectionViewCell *cell = (UICollectionViewCell*)[[sender superview] superview]; 
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:cell.tag inSection:0]; 
    EPaper *epaper = [self.fetchedResultsController objectAtIndexPath:indexPath]; 

    if (epaper) { 

     DHEPaperLoadingViewController *epaperLoadingViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"epaperLoadingController"]; 
     epaperLoadingViewController.epaper = epaper; 
     epaperLoadingViewController.hidesBottomBarWhenPushed = YES; 
     [self.navigationController pushViewController:epaperLoadingViewController animated:YES]; 
    } 

} 

Этот код находится в методе viewDidLoad нового контроллера View и решает, как обрабатывать данные.

if (self.epaper.pdfData) { 
     [self createPDFForData:self.epaper.pdfData]; 
     [self displayPDF]; 
    } 
    else { 
     [DHDownloadHelper downloadPDFWithRequest:[self createURLRequest]]; 

     __weak DHEPaperLoadingViewController *weakSelf = self; 
     EPaper *currentEpaper = self.epaper; 
     [[NSNotificationCenter defaultCenter] addObserverForName:EPAPER_DOWNLOAD_PROGRESS_NOTIFICATION object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { 
      NSDictionary *userInfo = note.object; 
      float progress = [[userInfo objectForKey:EPAPER_DOWNLOAD_PROGRESS] floatValue]; 
      weakSelf.progressBar.progress = progress; 
     }]; 

     [[NSNotificationCenter defaultCenter] addObserverForName:EPAPER_DOWNLOAD_FINISHED_NOTIFICATION object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { 
      NSDictionary *userInfo = note.object; 
      NSData *data = [userInfo objectForKey:EPAPER_DOWNLOAD_DATA]; 
      currentEpaper.pdfData = data; 


      [currentEpaper.managedObjectContext save:nil]; 
      [weakSelf createPDFForData:data]; 
      [weakSelf displayPDF]; 
     }]; 
    } 
} 

В большинстве случаев это нормально работает. Однако там ситуации, когда EXC_BAD_ACCESS появляется произойдет на этой линии:

if (self.epaper.pdfData) //EXC_BAD_ACCESS 

Эта ошибка возникает при следующих условиях и могут быть воспроизведены:

  • Кнопка чтения было запущено 3 раза для того же элемента (Он может быть запущен один раз, и он загружается правильно, он может быть вызван снова, и он правильно отображает PDF, не загружая его снова, но сбой в третий раз)
  • Один pdf был загружен и отображен правильно, а другой предмет нужен для загрузки

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

Что еще может вызвать эту проблему?

Заранее спасибо.

ответ

0

Вы могли бы попробовать это

if (self.epaper && self.epaper.pdfData) 

, но я не уверен, что будет скрываться еще один вопрос.

Также вы удаляете себя в качестве наблюдателя для этих уведомлений? Из документов ...

Вы должны вызвать removeObserver: или removeObserver: Имя: Объект: перед любым объектом, указанного addObserverForName: объект: очереди: usingBlock: освобождаются.

+0

Спасибо за ответ. self.paper не ноль. На самом деле он ссылается на управляемый объект, как и предполагалось. Код передает условие if (self.paper), но сбой (в вышеупомянутых случаях), когда я пытаюсь получить доступ к self.epaper.pdfData. Я забыл удалить себя, но добавил его сейчас. Все же приводит к той же ошибке. Но спасибо за просветление! –

Смежные вопросы