2013-02-27 146 views
2

我在viewDidLoad方法中添加了NSNotificationCenter方法,並在viewDidUnload中刪除了它,但它沒有被刪除。我正在關注ARC。我遵循了幾個答案,但我沒有得到運氣。我沒有給予評論的聲望,所以張貼一些事情看起來像重複。請不要對我投票。NSNotificationCenter觀察員沒有被刪除?

示例代碼:

- (void)viewDidLoad 
{  
    [[NSNotificationCenter defaultCenter ] addObserver:self.containerView 
               selector:@selector(loadInitialScreen) 
                name:CLEARSCREEN_DEPOSIT 
               object:NULL]; 
} 

- (void)viewDidUnload 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self.containerView 
                name:CLEARSCREEN_DEPOSIT 
                object:nil]; 

} 
+0

不太熟悉,但在OBJ-C看空始終是一個紅旗 – JoshRagem 2013-02-27 07:22:38

+1

你確定視圖正在卸載嗎? – 2013-02-27 07:23:13

回答

1

嘗試使用viewDidDisappear代替viewDidUnload

-(void)viewDidDisappear:(BOOL)animated 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self.containerView 
                name:CLEARSCREEN_DEPOSIT object:nil]; 
    [super viewDidDisappear:animated]; 
} 
+0

這有什麼不同? – trojanfoe 2013-02-27 07:23:51

+0

@trojanfoe檢查雕刻師的答案。對不起,我遲到了午餐。 – Rushi 2013-02-27 07:51:43

4

您應該刪除觀察者無論在-viewWillDisappear:-viewDidDisappear:-dealloc方法,根據您的需要。原因是iOS6 +中的-viewDidUnload從不再被調用,在iOS6之前它會在收到內存警告時調用。

+0

是的,但我看到一些在我們使用ARC時-dealloc方法沒有用的地方?我會嘗試viewWillDisappear。謝謝@graver – 2013-02-27 09:49:04

+2

'-dealloc'方法對'ARC'完全有用,尤其是對於註銷觀察者,釋放C對象等等。唯一的是你不能(實際上不能)調用'[super dealloc]; '最後。 – graver 2013-02-27 10:02:51

0

當應用程序/視圖控制器收到內存警告時,調用viewDidUnload(對於< iOS 6.0)。 它不會被調用去除該視圖,因爲該dealloc被調用。但是,當你使用ARC時,你不能實現dealloc方法。

最好的辦法是在方法loadInitialScreen中刪除觀察者,如果它只被調用一次。

如果您的通知可以發佈多次,這是更好地去除viewDidDisappear觀察者,但隨後在viewWillAppear中添加觀察員通知

相關問題