额,标题很长,但不得不这样写。
很多人可能碰到和我一样的疑惑,我明明把某个
objectView
直接removeFromSuperview
了,为什么我下面判断if(objectView){}
这个分支仍然能进去呢?我不是已经删除了吗?
实际上,你可能和我一样,没有理解这个removeFromSuperview
到底是什么意思,先来说说这个属性的意思:
官方文档这样描述它
Unlinks the receiver from its superview and its window, and removes it from the responder chain.
If the view’s superview is not nil, the superview releases the view.
把当前view
从它的父view
和窗口中移除,并且也把它从响应事件的响应链中移除。如果这个视图不为nil
,父视图会释放这个视图。
上面说了,父视图会释放这个视图,但是我们实际测试却没有,那么我们猜测可能是因为属性的强引用导致其根本没有释放。果然,查了下资料,有人这样说:
如果没有其他地方再对视图进行强引用,则会从内存中移除。如果还存在其他强引用,视图只是不在屏幕中显示,并没有将该视图从内存中移除。所以如果需要使用该视图,不需要再次创建,而是直接
addSubview
就可以了。
由此,就好解决了,直接把强引用的strong
修改成weak
,局部创建对象,用weak
指向该对象即可。这样弱引用就不会影响父视图对目标视图的释放操作,继而判定其对象的是否存在也可行了。
iOS技术交流群: 511860085
欢迎加入!