2012-01-11 1 views
1

나는 UIPopoverController 안에 UINavigationController 안에 UITableViewController을 가지고 있습니다.EXC_BAD_ACCESS - NSFetchedResultsController, UITableViewController, UINavigationController, UIPopoverController

UITableViewControllerNSFetchedResultsController을 사용합니다. 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; 

BookmarkViewControllerNSFetchedResultsControllerBookmarkViewControllerNSFetchedResultsControllerdelegate의 사용이다.

- (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]; 
} 

답변

0

내가 몇 가지 관련 질문을 발견 :

Deallocated view controller causing EXC_BAD_ACCESS because of fetched results controller update

If I release, I get bad access, if I retain, I leak

는 제 2 링크는 나에게 위임을 설정하는 생각을했다 dealloc 메서드에서 무조건 사용

-(void) dealloc 
{ 
    self.fetchedResultsController.delegate = nil; 
} 

하지만 ARC를 사용하고 있으므로 [super dealloc]을 명시 적으로 호출 할 수 없습니다. 문제를 해결하는 것으로 보이지만 이것이 올바른지 확신 할 수 없습니다. 나머지 지역 변수도 nil으로 설정해야합니까? 이것이 컴파일러가 생성 한 것을 오버라이드하면 누출 될 것인가?

+1

더 이상 필요가 없기 때문에'[super dealloc]'을 명시 적으로 호출 할 수 없습니다. 이것은 모두 당신을 위해 처리됩니다. 나머지 속성을 없앨 필요는 없지만'-dealloc'을 사용하여이 객체로 설정 한 옵저버를 정리할 수 있습니다. –