垃圾清理c#事件

时间:2017-03-18 19:22:11

标签: c# events

假设我有一个可以订阅的c#类:

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {      
       if let view = view as? UITableViewHeaderFooterView{
      view.backgroundView?.backgroundColor = UIColor.clearColor()
       }
}

......以及另一个利用它的类:

public class Emitter {
  public delegate void EmitAction(Emitter emitter);
  public event EmitAction OnEmitted;

  public void DoEmit() {
     if(OnEmitted != null)
       OnEmitted(this);
  }
}

我知道,对于代码清洁和避免内存泄漏,在使用事件时,每次订阅都有一个取消订阅总是好的。但是在这种情况下,Emitter实例是在SomeFunction()本地创建的,并且在内存中保存的时间太长,所以我猜测事件订阅是用本地实例销毁的。

在处理程序中取消订阅仍然是个好主意吗?如果是这样的话?

2 个答案:

答案 0 :(得分:0)

是的,您不需要取消订阅,因为正如您所说em变量在SomeFuction返回后被销毁,并且没有其他人引用此对象,因此垃圾收集器可以清理它。 / p>

答案 1 :(得分:0)

好吧,em是一个本地实例,会在HandleIt结束时被销毁。如果您不打算在其他任何地方使用它,您可以选择保留它。

但是如果你在其他地方引用它,或者将来创建它,那就会产生问题。此外,找到与事件相关的错误的根本原因是棘手的。

我注意到您正在传递emitter引用。有人可以再次使用相同的引用来调用不同的方法或在handleIt内引发事件。

所以,我建议你这样做,只是为了面向未来的代码。

相关问题