EXC_BAD_ACCESS - NSFetchedResultsController,UITableViewController,UINavigationController,UIPopoverController

时间:2012-01-11 12:51:50

标签: ios cocoa-touch core-data automatic-ref-counting

我在UITableViewControllerUINavigationController内有UIPopoverController

UITableViewController使用NSFetchedResultsController didSelectRowAtIndexPath 将我的UITableViewController的另一个实例与略有不同的谓词推送到导航控制器堆栈。

如果我将一个新的UITableViewController推入堆栈,然后再次弹出它,如果我尝试保存一个更新了弹出的tableview的对象,我最终会得到一个EXC_BAD_ACCESS关闭。

正如预期的那样,将NSFetchedResultsController的委托设置为nil会删除EXC_BAD_ACCESS错误。

我正在使用ARC。很明显,这些对象正在被释放。还行吧。但是,为什么在发生变化时仍然会收到通知?

以下代码。我基本上是在跟踪数据库中Web视图的历史记录。

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使用NSFetchedResultsControllerBookmarkViewControllerdelegate的{​​{1}}。

NSFetchedResultsController

我也有:

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

1 个答案:

答案 0 :(得分: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

第二个链接让我想到了在dealloc方法中将委托设置为nil

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

但我正在使用ARC,因此无法明确调用[super dealloc]。似乎可以解决问题,但我不确定这是否正确。我还应该将其余的局部变量设置为nil吗?如果这会覆盖编译器生成的内容,它会泄漏吗?