iOS objectView.removeFromSuperview之后if(self.objectView)仍然成立?
// 移除当前自定义视图
for(UIView *myView in [self.view subviews])
{
if ([myView isEqual:self.unfinishedView]) {
[myView removeFromSuperview];
}
}
很多人可能碰到和我一样的疑惑,我明明把某个 unfinishedView
直接removeFromSuperview
了,为什么我下面判断if(objectView){}
这个分支仍然能进去呢?我不是已经删除了吗?
官方文档这样描述它
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
,父视图会释放这个视图。
个人理解是 其生命周期和父试图一样,如果你自定义的视图是 strong 修饰 则引用计数为2,则不会被释放,如何再次执行 addSubview 就又出现了。
如果 是用weak修饰 则引用计数为1 ,可以被释放。
那当我们使用自定义的UIView时用weak还是strong呢?
我个人觉得应该用 strong,因为用 weak 并没有什么特别的优势,并且 weak 变量会有额外的系统维护开销的,如果你没有使用它的特别的理由,那么用 strong 的话应该更好。
如果你要做 Lazy 加载,那么你也只能选择用 strong。
注意,如果你非要用 weak,其实也没什么问题,只需要注意在赋值前,先把这个对象用 addSubView 加到父 view 上,否则可能刚刚创建完,它就被释放了。