假设我有一个可以订阅的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()本地创建的,并且在内存中保存的时间太长,所以我猜测事件订阅是用本地实例销毁的。
在处理程序中取消订阅仍然是个好主意吗?如果是这样的话?
答案 0 :(得分:0)
是的,您不需要取消订阅,因为正如您所说em
变量在SomeFuction
返回后被销毁,并且没有其他人引用此对象,因此垃圾收集器可以清理它。 / p>
答案 1 :(得分:0)
好吧,em
是一个本地实例,会在HandleIt
结束时被销毁。如果您不打算在其他任何地方使用它,您可以选择保留它。
但是如果你在其他地方引用它,或者将来创建它,那就会产生问题。此外,找到与事件相关的错误的根本原因是棘手的。
我注意到您正在传递emitter
引用。有人可以再次使用相同的引用来调用不同的方法或在handleIt
内引发事件。
所以,我建议你这样做,只是为了面向未来的代码。