Weak is not weak,Strong is not strong

問題

今天作瀏覽器Controller的時候,碰到了一個奇怪的問題:每次pop瀏覽器controller以後,等幾秒,總會碰到相似下面的錯誤(其中的xxxController就是瀏覽器或繼承他的子類Controller)git

*** -[xxxController respondsToSelector:]: message sent to deallocated instance 0xecf79b0

排錯

加各類斷點、開Zombie,內存Malloc,Profiling都沒法有效的找到問題所在。github

最後下決心一點一點的屏蔽代碼,終於發現原來有經過代碼建立的webView,對應的@property的修飾被誤寫爲strong,改成weak以後,這個世界終於又平靜了。web

癥結

問題解決,反過來想想,之因此會致使崩潰,應該是由於被strong修飾的webView在controller銷燬的時候,尚未被銷燬掉,還在加載網頁並觸發delegate的回調,而webView的delegate恰好是已被銷燬的controller自己,因此,崩潰!瀏覽器

經測試,上述想法被印證。測試

PS:固然若是可以養成dealloc裏把webwebView的delegate設置爲nil並中止加載頁面,這個問題也就不是問題了。code

Weak is not weak, Strong is not strong!

隨着iOS7快速佔據半壁江山,不少應用已經從iOS6,甚至iOS7開始支持,ARC憑藉方便的內存管理,不少項目已經默認採用,而在ARC的使用過程當中,最經常使用到的就是對屬性@property的修飾:strong、weak,因此,兄弟們要留心,不要犯和我一樣的錯啊!繼承

相關文章
相關標籤/搜索