2

我不明白为什么我需要在某些方面表现出弱自我,而其他方面似乎工作正常。

如果我在 Notification 块中没有对 self 的弱引用,则不会释放 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];
}];
4

1 回答 1

3

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

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

于 2013-03-13T14:01:15.220 回答