UITableView的委托和dataSource引用未设置为nil。 EXC_BAD_ACCESS

时间:2014-06-18 08:37:02

标签: ios objective-c uitableview delegates block

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

@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来解决这个问题。但我大多只是好奇为什么需要这一步。这些块是否会以某种方式导致弱引用被保留(即使它从未在块中引用/没有意义)?

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

Apple的许多课程仍然使用assign,而不是weak。您可以在文档或头文件中自己检查(命令 - 单击Xco​​de中的delegate或dataSource属性)。 assignunsafe_unretained相同,这意味着如果其引用的对象已取消分配,则会自动设置为nil。