如何调整Vala中Lambda表达式捕获的变量?

时间:2016-08-18 09:34:10

标签: memory lambda vala

如何在匿名函数中仅微弱地捕获this

我无法在文档中找到关于是否(或如何)调用匿名函数/ lambda表达式捕获的变量的任何内容。问题是这些函数似乎捕获了堆栈帧中的所有变量,至少在默认情况下是创建它们的。特别是,它们总是捕获this,这在将它们用于信号处理程序时会出现问题,因为处理程序会变成对this的硬引用,这可能导致引用循环。

Vala是否有一些关于如何防止lambdas捕获this的硬引用的机制?目前,我正在为每个信号处理程序创建一个新类,例如A.Handler,其中我只保留对this的实际A的弱引用,我需要从中引用处理程序内部,但我认为这会破坏lambda表达式的好处。

1 个答案:

答案 0 :(得分:1)

在lambda里面,没有。标准方法是:

class Foo : Whatever {

  public Foo {
    unowned Foo unowned_this = this;
    this.bar_signal.connect(unowned_this.bar_handler);
  }
  private void bar_handler() {
    ...
  }
}

这不会捕获对此的引用,但您也无法捕获任何其他变量。