我有一个为我处理分页数据的类。该类具有以下属性:
@property (nonatomic, weak) UITableView *tableView;
@property (nonatomic, weak) id <DataSourceProtocol> dataSource;
我有一个视图控制器,告诉分页控制器在需要时加载更多数据。然后分页控制器告诉其dataSource它需要新数据,dataSource下载这些数据并让分页控制器知道。分页控制器保存此数据并重新加载其表视图。
在此过程中取消分配视图控制器时出现问题。例如,当视图控制器被解除时,分页数据源当前正在检索数据。一旦新数据到达并传递给分页控制器,分页控制器就会告诉其tableView重新加载数据。崩溃。此时,tableView的委托和dataSource(视图控制器)在某种程度上是非零的,尽管已经取消分配。现在参考垃圾并发生崩溃。
我见过其他一些问题和答案: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
}
显然,我可以通过在视图控制器的dealloc中显式地填充tableView的委托和dataSource来解决这个问题。但我大多只是好奇为什么需要这一步。这些块是否会以某种方式导致弱引用被保留(即使它从未在块中引用/没有意义)?
非常感谢任何帮助。
答案 0 :(得分:1)
Apple的许多课程仍然使用assign
,而不是weak
。您可以在文档或头文件中自己检查(命令 - 单击Xcode中的delegate或dataSource属性)。 assign
与unsafe_unretained
相同,这意味着如果其引用的对象已取消分配,则不会自动设置为nil。