方法
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()
。