gpt4 book ai didi

ios - UITableView 的委托(delegate)和数据源引用未设置为 nil。 EXC_BAD_ACCESS

转载 作者:行者123 更新时间:2023-11-29 12:43:27 26 4
gpt4 key购买 nike

我有一个类可以为我处理分页数据。此类具有以下属性:

@property (nonatomic, weak) UITableView *tableView;
@property (nonatomic, weak) id <DataSourceProtocol> dataSource;

我有一个 View Controller 告诉分页 Controller 在需要时加载更多数据。然后分页 Controller 告诉它的数据源它需要新数据,数据源下载这些数据并让分页 Controller 知道。分页 Controller 保存此数据并重新加载其 TableView 。

当 View Controller 在这个过程中被释放时,问题就来了。例如,当 View Controller 关闭时,分页数据源当前正在检索数据。一旦新数据到达并传递给分页 Controller ,分页 Controller 就会通知其 tableView 重新加载数据。碰撞。不知何故,此时 tableView 的委托(delegate)和数据源( View Controller )是非零的,尽管已被释放。该引用现在是垃圾并且发生了崩溃。

我还看到了一些其他类似这样的问题和答案:Weak property not zeroing using ARC但大多数处理将弱引用作为参数传递的方法调用,而我的则没有。

这里是代码的简要概述(经过简化和精简):

// In the view controller (also the pagination dataSource):
// Called by the pagination controller to get more data it needs
- (void)PCNeedsData:(PC *)pc
{
[_obj getData:^(NSArray *data) {
// By now the view controller is deallocated
[pc addData:data];
}];
}

// In the pagination controller
- (void)addData:(NSArray *)data
{
[_data addObjectsFromArray:data];
[_tableView reloadData]; // Crash because _tableView.delegate / dataSource are deallocated but non-nil
}

显然,我可以通过在 View Controller 的 dealloc 中明确取消 tableView 的委托(delegate)和数据源来解决这个问题。但我主要只是好奇为什么需要这一步。这些 block 是否以某种方式导致弱引用被保留(即使它从未在 block 中被引用/这没有意义)?

如有任何帮助,我们将不胜感激。

最佳答案

Apple 的许多类仍然使用assign,而不是weak。您可以在文档或头文件中自行检查(在 Xcode 中按住 command 键并单击 delegate 或 dataSource 属性)。 assignunsafe_unretained 相同,这意味着如果它引用的对象被释放,它不会自动设置为 nil。

关于ios - UITableView 的委托(delegate)和数据源引用未设置为 nil。 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24280860/

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