使用NSNotificationCenter遇到的问题

0x00 问题

    在项目中使用NSNotificationCenter时发现有个对象没法释放,后来自己创建一个Demo来验证该问题,具体代码如下所示:

使用NSNotificationCenter遇到的问题_第1张图片

0x01 分析

 observer对象并没有被释放,因为使用了block,初步猜测是因为block问题引起的,打断点看了之后发现NotificationObsever 中的属性observe会拥有block,而block中又引用self,而NSNotificationCenter又没有remove观察者,所以导致没法释放。具体属性如下所示:


使用NSNotificationCenter遇到的问题_第2张图片

0x02 解决方法

如果在合适的地方将通知移除或者在block中引用self使用弱引用即可解决该问题,有些文章中说是循坏引用,其实这个说法是错误的,仔细分析代码发现并没有循坏引用。

0x03 总结

通过这个问题我们要注意通知需要移除,养成一种习惯;在block中一定要注意对外部的引用变量,一不小心就会引起强引用问题导致没法释放。


你可能感兴趣的:(使用NSNotificationCenter遇到的问题)