您好,欢迎访问代理记账网站
  • 价格透明
  • 信息保密
  • 进度掌控
  • 售后无忧

removeFromSuperview 理解

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 上,否则可能刚刚创建完,它就被释放了。


分享:

低价透明

统一报价,无隐形消费

金牌服务

一对一专属顾问7*24小时金牌服务

信息保密

个人信息安全有保障

售后无忧

服务出问题客服经理全程跟进