方法

GObjectClosuresink

声明 [src]

void
g_closure_sink (
  GClosure* closure
)

描述 [src]

接管一个 closure 的初始所有权。

每个 closure 初始处于“浮动”状态,这意味着初始引用计数不属于任何调用者。

此函数会检查对象是否仍在浮动状态,如果是,则会取消浮动状态并减少引用计数。如果 closure 不在浮动状态,则 g_closure_sink() 不做任何操作。

浮动状态存在的原因是为了防止编写繁琐的代码序列,例如

closure = g_cclosure_new (cb_func, cb_data);
g_source_set_closure (source, closure);
g_closure_unref (closure); // GObject doesn't really need this

因为 g_source_set_closure()(以及类似的函数)会接管初始引用计数,如果未指定所有者,我们可以改写为

g_source_set_closure (source, g_cclosure_new (cb_func, cb_data));

一般情况下,此函数与 g_closure_ref() 一起使用。以下是一个存储 closure 以供后续通知的示例

static GClosure *notify_closure = NULL;
void
foo_notify_set_closure (GClosure *closure)
{
  if (notify_closure)
    g_closure_unref (notify_closure);
  notify_closure = closure;
  if (notify_closure)
    {
      g_closure_ref (notify_closure);
      g_closure_sink (notify_closure);
    }
}

因为 g_closure_sink() 可能会减少 closure 的引用计数(如果尚未在 closure 上调用),就像 g_closure_unref() 一样,所以应在此函数之前调用 g_closure_ref()