使用NSNotificationCenter遇到的問題

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)致沒法釋放。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容