0x00 問題
? ? 在項(xiàng)目中使用NSNotificationCenter時(shí)發(fā)現(xiàn)有個(gè)對(duì)象沒法釋放,后來自己創(chuàng)建一個(gè)Demo來驗(yàn)證該問題,具體代碼如下所示:
0x01 分析
?observer對(duì)象并沒有被釋放,因?yàn)槭褂昧薭lock,初步猜測(cè)是因?yàn)閎lock問題引起的,打斷點(diǎn)看了之后發(fā)現(xiàn)NotificationObsever 中的屬性observe會(huì)擁有block,而block中又引用self,而NSNotificationCenter又沒有remove觀察者,所以導(dǎo)致沒法釋放。具體屬性如下所示:
0x02 解決方法
如果在合適的地方將通知移除或者在block中引用self使用弱引用即可解決該問題,有些文章中說是循壞引用,其實(shí)這個(gè)說法是錯(cuò)誤的,仔細(xì)分析代碼發(fā)現(xiàn)并沒有循壞引用。
0x03 總結(jié)
通過這個(gè)問題我們要注意通知需要移除,養(yǎng)成一種習(xí)慣;在block中一定要注意對(duì)外部的引用變量,一不小心就會(huì)引起強(qiáng)引用問題導(dǎo)致沒法釋放。