ARC:没有调用 Dealloc
Posted
技术标签:
【中文标题】ARC:没有调用 Dealloc【英文标题】:ARC: Dealloc not being called 【发布时间】:2013-03-13 13:58:17 【问题描述】:我不明白为什么我需要在某些方面拥有弱自我,而其他方面似乎可以正常工作。
如果我在 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];
];
【问题讨论】:
第一个代码示例中的weakSelf
是如何定义的?
【参考方案1】:
这是因为一个引用随着时间的推移而消失(例如 - 当调用完成处理程序时),该块被释放。在这种情况下,没有保留循环,因为对 self 的引用将被释放。
但是,对于 NSNotification 示例,必须始终保留块引用(除非手动删除它),因为它仍在侦听 NSNotification。在这种情况下,对 self 的引用会导致一个保留循环,从而导致类不被保留。
【讨论】:
所以他在第一个代码示例中可能指的是self
,而不是weakSelf
。以上是关于ARC:没有调用 Dealloc的主要内容,如果未能解决你的问题,请参考以下文章
ARC 的 main() 中的 EXC_BAD_ACCESS 但没有提示错误