2013-03-13 81 views
2

我不明白爲什麼我需要在某些塊中有一個弱自我,而其他人似乎工作正常。ARC:Dealloc不被稱爲

如果我對通知塊沒有弱自我引用,dealloc將不會被釋放。儘管如此,它仍然可以很好地工作。

//When using this, dealloc is NOT being called 
[[NSNotificationCenter defaultCenter] addObserverForName:PROD_DONE object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { 
    [self hideAds]; 
}]; 

//When using this, dealloc IS being called 
[_match endMatchInTurnWithMatchData:_match.matchData completionHandler:^(NSError *error) { 
    [self hideAds]; 
}]; 

如果我創建一個弱裁判的自我,它的工作原理:

__weak GameViewController *weakSelf = self; 
[[NSNotificationCenter defaultCenter] addObserverForName:PROD_DONE object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) { 
    [weakSelf hideAds]; 
}]; 
+1

在您的第一個代碼示例中如何定義weakSelf? – 2013-03-13 14:01:42

回答

3

這是因爲一個引用消失一段時間(例如 - 當完成處理程序被調用),該塊釋放。在這種情況下,沒有保留週期,因爲對自我的引用將被釋放。

但是,對於NSNotification示例,塊引用必須始終保留(除非手動刪除它),因爲它仍在偵聽NSNotification。在這種情況下,對自身的引用會導致保留週期,導致不保留該類。

+0

所以他可能在第一個代碼示例中表示「self」,而不是「weakSelf」。 – 2013-03-13 14:05:39

+0

是啊,自我..感謝您的幫助 – BlackMouse 2013-03-13 14:08:25