Weak is not weak,Strong is not strong

时间:2023-02-14 21:56:50

问题

今天做浏览器Controller的时候,碰到了一个奇怪的问题:每次pop浏览器controller之后,等几秒,总会碰到类似下面的错误(其中的xxxController就是浏览器或继承他的子类Controller)

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

排错

加各种断点、开Zombie,内存Malloc,Profiling都无法有效的找到问题所在。

最后下决心一点一点的屏蔽代码,终于发现原来有通过代码创建的webView,对应的@property的修饰被误写为strong,改为weak之后,这个世界终于又平静了。

症结

问题解决,反过来想一想,之所以会导致崩溃,应该是因为被strong修饰的webView在controller销毁的时候,还没有被销毁掉,还在加载网页并触发delegate的回调,而webView的delegate刚好是已被销毁的controller本身,所以,崩溃!

经测试,上述想法被印证。

PS:当然如果能够养成dealloc里把webwebView的delegate设置为nil并停止加载页面,这个问题也就不是问题了。

Weak is not weak, Strong is not strong!

随着iOS7快速占据半壁*,很多应用已经从iOS6,甚至iOS7开始支持,ARC凭借方便的内存管理,很多项目已经默认采用,而在ARC的使用过程中,最常用到的就是对属性@property的修饰:strong、weak,所以,兄弟们要留心,不要犯和我同样的错啊!