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的主要内容,如果未能解决你的问题,请参考以下文章

iOS:释放正在使用的对象 (ARC)

ARC 的 main() 中的 EXC_BAD_ACCESS 但没有提示错误

iOS:ARC,不释放内存

Unity中的ARC ObjC代码?

UIViewController 在 dealloc 时不释放子视图(使用 ARC)

iOS-开启arc之后 NSNotificationCenter removeObserver 是否需要调用