0x00 问题
在项目中使用NSNotificationCenter时发现有个对象没法释放,后来自己创建一个Demo来验证该问题,具体代码如下所示:
0x01 分析
observer对象并没有被释放,因为使用了block,初步猜测是因为block问题引起的,打断点看了之后发现NotificationObsever 中的属性observe会拥有block,而block中又引用self,而NSNotificationCenter又没有remove观察者,所以导致没法释放。具体属性如下所示:
0x02 解决方法
如果在合适的地方将通知移除或者在block中引用self使用弱引用即可解决该问题,有些文章中说是循坏引用,其实这个说法是错误的,仔细分析代码发现并没有循坏引用。
0x03 总结
通过这个问题我们要注意通知需要移除,养成一种习惯;在block中一定要注意对外部的引用变量,一不小心就会引起强引用问题导致没法释放。