У меня возникла проблема с моим текущим проектом.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 знаний возникает, когда объект уже выпущен, но у меня есть сильный указатель на него, и проверяется, если он отвечает на селектор собственности (что делает). Я также убедился, что код выполняется в основном потоке.
Что еще может вызвать эту проблему?
Заранее спасибо.
Спасибо за ответ. self.paper не ноль. На самом деле он ссылается на управляемый объект, как и предполагалось. Код передает условие if (self.paper), но сбой (в вышеупомянутых случаях), когда я пытаюсь получить доступ к self.epaper.pdfData. Я забыл удалить себя, но добавил его сейчас. Все же приводит к той же ошибке. Но спасибо за просветление! –