2013-07-08 15 views
0

我正在實現一個UITableView作爲包含5個表格單元格的第一級視圖控制器。擊中任何這些單元格將呈現第二級視圖。在此級別視圖的左上角,有一個「返回」按鈕可返回到第一級視圖。在第二級視圖中,向左或向右滑動將連續顯示與第一級視圖中的相鄰表格單元格鏈接的相鄰視圖。關鍵值觀察者和NSKVODeallocateBreak的錯誤

運行後,從第一級視圖到第二級視圖沒關係。但是當按下「返回」按鈕,從第二層視圖返回到第一層視圖時,以下是我得到的問題。

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> 
) 

我在我使用實現一個無限滾動視圖控制器GDIInfinitePageScrollViewController.m發現

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

。當我評論這一點時,問題仍然存在。

當我設置斷點NSKVODeallocateBreak,這裏是我得到

0x1170ae0: pushl %ebp 

,但我沒有關於這意味着什麼想法。

有誰知道如何解決這個問題?

回答

1

您得到該消息的原因是因爲UIScrollView實例在其觀察者被移除之前正在發佈。

方法 - (void)viewDidUnload在視圖已經被釋放時被調用,所以調用來移除觀察者爲時已晚。此外,這已被iOS 6棄用,以及 - (void)viewWillUnload。

作爲替代方法,請嘗試在點擊後退按鈕時刪除觀察者。

+2

需要明確的是,該文件說,對於viewWillUnload和viewDidUnload:「**此方法從來沒有所謂的**」,以便在「不建議」它不會被棄用它被棄用,因爲「根本無法工作」。 – ipmcc

+0

我在' - (void)viewDidUnload'中使用相同的代碼嘗試了' - (void)dealloc',並同時將它評論出來,就像[this](http://i40.tinypic.com/o9hamr.png)一樣,那麼問題不會再發生。它看起來已解決。爲什麼? – S1U

+0

正如ipmcc提到的,' - (void)viewDidUnload'永遠不會被框架調用,所以您的代碼刪除觀察者從未被執行。當你從第二級移動回到第一級時,控制器被釋放,調用' - (void)dealloc'。在這裏,你仍然可以訪問你的視圖並以觀察者的身份移除'self'。 –

1

- (void)viewWillDisappear更換- (void)viewDidUnload爲我工作