移除观察者

时间:2015-09-21 19:24:11

标签: ios objective-c uitableview uiviewcontroller key-value-observing

我的UIViewController有一个UITableView。每个自定义单元格都有一个weak关联的模型对象。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{   
    List *list = self.lists[indexPath.row];
    ListCoverTableViewCell *cell = (ListCoverTableViewCell *)[tableView dequeueReusableCellWithIdentifier:NormalCell forIndexPath:indexPath];
    cell.list = list;
    return cell;
}

然后,每个单元格都会在模型对象上观察一个属性。

- (void)addProgressObserverToCell:(ListCoverTableViewCell *)cell
{
    @try {
        [cell.list.tasksManager addObserver:cell
                                 forKeyPath:NSStringFromSelector(@selector(fractionCompleted))
                                    options:0 context:nil];
    } @catch (NSException *__unused exception) {}
}
从viewWillAppear调用

addProgressObserverToCell:(如果用户点击一个单元格并返回),并在tableView的willDisplayCell:中调用(用户滚动时)。

类似的方法removeProgressObserverFromCellviewWillDisappear中调用(当用户点击一个单元格并导航时)和tableView的didEndDisplayingCell(用户滚动时)。

- (void)removeProgressObserverFromCell:(ListCoverTableViewCell *)cell
{
    @try {
        [cell.list.tasksManager removeObserver:cell
                                    forKeyPath:NSStringFromSelector(@selector(fractionCompleted))
                                       context:nil];
    } @catch (NSException *__unused exception) {}
}

到目前为止,一切都是平衡的。我在viewWillAppear / willDisplayCell中添加观察者,并在viewWillDisappear / didEndDisplayingCell中删除它们。

为了安全(和防御),我更新了我的ViewController的dealloc方法以删除所有观察者。我只是遍历tableView的可见单元格并调用removeProgressObserverFromCell:

通过在dealloc中运行此代码,我发现存储在我的UITableView visibleCells中的模型对象永远不会被释放。我的防御性移除观察者如何导致我的模型对象被保留?

0 个答案:

没有答案