在释放其实例时是否必须将委托设置为nil并将其引用到自身?

时间:2017-09-16 19:11:11

标签: ios swift delegates automatic-ref-counting

系统类是子类化,代理引用自身。

class MyScrollView: UIScrollView {
   convenience init() {
     delegate = self
   }

   // Is this necessary?
   deinit {
      delegate = nil
   }
}

解除分配实例时,UIScrollView.delegate属性是否必须设置为nil?

2 个答案:

答案 0 :(得分:1)

只有强引用可以保持和实例存活。弱引用(例如此delegate成员)不足以导致强引用周期。这需要......强有力的参考。

另一方面,将delegate = nil放在deinit中并不是很有意义。即使delegate成员保持此实例存活,(它不是),那么这个deinit也不会被调用。

答案 1 :(得分:1)

// Is this necessary?
deinit {
   delegate = nil
}

在Swift的nil中将值设置为deinit永远不会是必要的(无论如何,您认为它正在做的任何事情都将由ARC自动完成)。还有很多其他原因在这个具体案例中没有必要,但事实上这个deinit永远不正确。斯威夫特胜过它们。

这与你问题的标题无关;我不确定为什么这是标题。