나는 UIPopoverController
안에 UINavigationController
안에 UITableViewController
을 가지고 있습니다.EXC_BAD_ACCESS - NSFetchedResultsController, UITableViewController, UINavigationController, UIPopoverController
UITableViewController
은 NSFetchedResultsController
을 사용합니다. didSelectRowAtIndexPath이 약간 다른 조건자를 사용하여 내 UITableViewController
의 다른 인스턴스를 탐색 컨트롤러 스택에 푸시합니다.
새로운 UITableViewController
을 스택에 꽂은 다음 다시 팝하면 튀어 나온 테이블 뷰를 업데이트 한 개체를 저장하려고하면 결국 EXC_BAD_ACCESS
이 표시됩니다.
예상대로 내 NSFetchedResultsController
의 대표자를 nil
으로 설정하면 EXC_BAD_ACCESS
오류가 제거됩니다.
저는 ARC를 사용하고 있습니다. 이렇게 명확하게이 목표는 풀어 놓고있다. 괜찮습니다. 그러나 변화가있을 때 그들은 왜 아직도 통보를 받고 있습니까?
아래 코드. 기본적으로 내 데이터베이스에서 웹보기의 기록을 추적하고 있습니다.
BookmarkViewController * bookmarkController = [[BookmarkViewController alloc] initWithStyle:UITableViewStylePlain andWebView:self.webView];
UINavigationController * bookmarkNavController = [[UINavigationController alloc] initWithRootViewController:bookmarkController];
self.bookmarkPopover = [[UIPopoverController alloc] initWithContentViewController:bookmarkNavController];
_bookmarkPopover.popoverContentSize = CGSizeMake(320, 44*10);
_bookmarkPopover.delegate = self;
bookmarkController.container=_bookmarkPopover;
bookmarkController.delegate=self;
BookmarkViewController
는 NSFetchedResultsController
및 BookmarkViewController
가 NSFetchedResultsController
delegate
의 사용이다.
- (NSFetchedResultsController *) myFetchedResultsController
{
if (self.fetchedResultsController != nil) {
return self.fetchedResultsController;
}
// Singleton
CoreDataManager * dataManager = [CoreDataManager defaultDataManager];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Bookmark" inManagedObjectContext:dataManager.managedObjectContext];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"label" ascending:NO];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:self.predicate];
[fetchRequest setSortDescriptors:sortDescriptors];
[fetchRequest setFetchBatchSize:20]; // Set the batch size to a suitable number.
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
managedObjectContext:dataManager.managedObjectContext
sectionNameKeyPath:@"type"
cacheName:nil];
self.fetchedResultsController.delegate = self;
return self.fetchedResultsController;
}
그리고 또한 내가 가진 :
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller {
[self.tableView beginUpdates];
}
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
[self.tableView endUpdates];
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
BookmarkViewController * bookmarkViewController = [[BookmarkViewController alloc] initWithStyle:self.tableView.style
andWebView:self.webview
forFolder:bookmark.label];
[self.navigationController pushViewController:bookmarkViewController animated:YES];
}
더 이상 필요가 없기 때문에'[super dealloc]'을 명시 적으로 호출 할 수 없습니다. 이것은 모두 당신을 위해 처리됩니다. 나머지 속성을 없앨 필요는 없지만'-dealloc'을 사용하여이 객체로 설정 한 옵저버를 정리할 수 있습니다. –