ARC:没有被叫到Dealloc

时间:2013-03-13 13:58:17

标签: ios objective-c c automatic-ref-counting

我不明白为什么我需要在某些区块中拥有弱者,而其他人似乎工作得很好。

如果我没有使用Notification块的弱自我,则不会释放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 个答案:

答案 0 :(得分:3)

这是因为一个引用随着时间消失(例如 - 当调用完成处理程序时),该块被释放。在这种情况下,没有保留周期,因为将释放对self的引用。

但是,对于NSNotification示例,必须始终保留块引用(除非手动删除),因为它仍在侦听NSNotification。在这种情况下,对self的引用会导致保留周期,从而导致不保留类。