调用view.removeFromSuperview()后是否需要将视图设置为nil?

时间:2016-01-02 06:46:22

标签: swift memory-management uiview uiviewcontroller uibutton

在下面的代码中,我有两个按钮。

button1是可选的,它被赋予了从superview中删除自身的功能。

button2被分配了一个功能,它将button1添加到superview,同时展开可选类型的button1。

我希望在调用.removeFromSuperview()后从内存中释放button1,这样当你点击button1后单击button2时,应用程序就会崩溃:

  var button1: UIButton?
  override func viewDidLoad() {
    super.viewDidLoad()
    var frame1 = CGRectMake(100, 150, 150, 40)
    button1 = UIButton(frame: frame1)
    button1!.setTitle("remove button 1", forState: .Normal)
    button1!.setTitleColor(UIColor.blackColor(), forState: .Normal)
    self.view.addSubview(button1!)
    button1!.addTarget(self, action: "remove:", forControlEvents: .TouchUpInside)

    let frame2 = CGRectMake(100, 250, 150, 40)
    let button2 = UIButton(frame: frame2)
    button2.setTitle("display button 1", forState: .Normal)
    button2.setTitleColor(UIColor.blueColor(), forState: .Normal)
    button2.addTarget(self, action: "display:", forControlEvents: .TouchUpInside)
    self.view.addSubview(button2)
  }
  func remove(sender: UIButton){
    button1?.removeFromSuperview()
  }
  func display(sender:UIButton){
    self.view.addSubview(button1!)
  }

当我点击button1时,它会从superview中删除。但是当我单击button2时,button1返回到superview而没有被初始化。 在致电button1 = nil后,是否有必要在remove函数中致电button1?.removeFromSuperview()?如果没有,是否在某个阶段从内存中释放了button1?

2 个答案:

答案 0 :(得分:4)

看看这个示例,这样你就可以理解为什么从button1删除了view但是它没有从内存中释放,因为从{{{{}}中删除后,保留计数仍为1 1}}。

view

答案 1 :(得分:4)

这实际上取决于。

如果您的UIView实例未分配给其他指针,因此不会增加引用计数,removeFromSuperView会将引用递减为0,并将其释放。在其他情况下,uiview还有其他强大的参考资料。

否则,如果要直接释放引用,则需要uiview = nil。