键值观察器和NSKVODeallocateBreak的错误

时间:2013-07-08 06:17:19

标签: uiscrollview key-value-observing

我正在将UITableView实现为包含5个表格单元格的第一级视图控制器。点击任何这些单元格将呈现第二级视图。在此级别视图的左上角,有一个“后退”按钮可返回到第一级视图。在第二级视图中,向左或向右滑动将连续显示相邻视图,链接到第一级视图中的相邻表格单元格。

运行后,从第一级视图到第二级视图就可以了。但是当点击“后退”按钮,从第二级视图返回到第一级视图时,以下是我遇到的问题。

An instance 0x7a8f130 of class UIScrollView was deallocated while key value observers were still registered with it. Observation info was leaked, and may even become mistakenly attached to some other object.
Set a breakpoint on NSKVODeallocateBreak to stop here in the debugger. 
Here's the current observation info: (
Context: 0x0, Property: 0x9149570>
)

我找到了

- (void)viewDidUnload
{
    [super viewDidUnload];
    [self.scrollView removeObserver:self forKeyPath:@"frame"];
    [self.scrollView removeFromSuperview];
    _scrollView = nil;
}

在我用来实现无限滚动视图控制器的GDIInfinitePageScrollViewController.m中。当我评论这个时,问题仍然存在。

当我设置断点NSKVODeallocateBreak时,这就是我得到的

0x1170ae0:  pushl  %ebp

但我不知道这意味着什么。

有谁知道如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

您收到该消息的原因是因为UIScrollView实例在其观察者被删除之前被释放。

方法 - (void)viewDidUnload在视图已被释放时被调用,因此调用删除观察者为时已晚。此外,这已被iOS 6弃用,以及 - (void)viewWillUnload。

作为替代方案,请在按下后退按钮时尝试移除观察者。

答案 1 :(得分:1)

- (void)viewDidUnload替换为- (void)viewWillDisappear为我工作