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



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

button1是可选的,它被分配了从超级视图中删除自己的功能。

button2被分配了一个函数,该函数将button1添加到superview,并打开可选类型的button1。

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

  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!)
  }

当我单击按钮1时,它将从超级视图中删除。但是,当我单击按钮2时,按钮1会返回到超级视图,而不会被初始化。调用button1?.removeFromSuperview()后,是否需要在remove函数中调用button1 = nil?如果没有,按钮1是否在某个特定阶段从内存中释放?

这实际上取决于。

如果你的UIView实例没有分配给其他指针,因此没有增加引用计数,removeFromSuperView将把引用减少到0,然后它就会被释放。在其他情况下,uiview仍然具有其他强引用。

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

看一下这个例子,这样你就可以理解为什么button1view中删除,但它没有从内存中释放,因为从view中删除后保留计数仍然是1。

// Retain count is 1
let button1 =  UIButton(frame: frame1)
// Retain count is 2
self.view.addSubview(button1)
// Retain count is 1 again
 button1.removeFromSuperview()

最新更新