瓣膜闭合参考周期



我正在Vala中编写一个类,将同一对象的两个属性绑定在一起,并使用闭包将一个属性转换为另一个属性。

class Foo : Object
{
public int num { get; set; }
public int scale = 2;
public int result { get; set; }
construct {
this.bind_property("num", this, "result", 0,
(binding, src, ref dst) => {
var a = src.get_int();
var b = this.scale;
var c = a * b;
dst.set_int(c);
}
);
}
}

闭包保持一个引用this(因为我使用this.scale(,它创建了一个引用循环,即使所有其他对它的引用都丢失了,这个引用循环也能保持我的类的活力。

只有当引用计数达到0时,绑定才会被删除,但只有当biding及其闭包被删除时,refcount才会达到0。

有没有办法使闭包对this的引用变弱?或者在refcount达到1时进行探测以将其移除?

未测试,但您可以将this分配给弱变量并在闭包中引用它吗?例如:

weak Foo weak_this = this;
this.bind_property(…, (…) => {
…
b = weak_this.scale;
…
}

这是Vala编译器的一个已知缺陷,本期将对此进行讨论。

目前,可以通过从静态方法进行绑定来避免这个问题,其中闭包不捕获this

class Foo : Object
{
public int num { get; set; }
public int scale = 2;
public int result { get; set; }
construct {
this.bind_properties(this);
}
private static void bind_properties(Foo this_)
{
weak Foo weak_this = this_;
this_.bind_property("num", this_, "result", 0,
(binding, src, ref dst) => {
var a = src.get_int();
var b = weak_this.scale;
var c = a * b;
dst.set_int(c);
}
);
}
}

相关内容

  • 没有找到相关文章

最新更新