gpt4 book ai didi

ios - EXC_BAD_ACCESS - NSFetchedResultsController、UITableViewController、UINavigationController、UIPopoverController

转载 作者:行者123 更新时间:2023-11-28 17:39:16 25 4
gpt4 key购买 nike

我在 UINavigationController 中有一个 UITableViewController,在 UIPopoverController 中。

UITableViewController 使用了一个NSFetchedResultsControllerdidSelectRowAtIndexPath 将我的 UITableViewController 的另一个实例推送到导航 Controller 堆栈上,略有不同谓词。

如果我将一个新的 UITableViewController 压入堆栈,然后再次将其弹出,如果我尝试保存一个可能具有的对象,我最终会得到一个 EXC_BAD_ACCESS更新了弹出的表格 View 。

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

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

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

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 并且BookmarkViewControllerNSFetchedResultsControllerdelegate >.

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

最佳答案

我发现了一些相关的问题:

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 方法中将委托(delegate)设置为 nil

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

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

关于ios - EXC_BAD_ACCESS - NSFetchedResultsController、UITableViewController、UINavigationController、UIPopoverController,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8819591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com