我的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:
中调用(用户滚动时)。
类似的方法removeProgressObserverFromCell
在viewWillDisappear
中调用(当用户点击一个单元格并导航时)和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
中的模型对象永远不会被释放。我的防御性移除观察者如何导致我的模型对象被保留?