我在UITableViewController
内UINavigationController
内有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
使用NSFetchedResultsController
而BookmarkViewController
是delegate
的{{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;
}
答案 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
吗?如果这会覆盖编译器生成的内容,它会泄漏吗?