函数
GObjectTypeValueCollectFunc
自: 2.78
说明
gchar*
(* GTypeValueCollectFunc) (
GValue* value,
guint n_collect_values,
GTypeCValue* collect_values,
guint collect_flags
)
说明 [src]
此函数负责将从变参元组中收集的值转换为适合存储在 GValue
中的内容。
此函数应类似于 GTypeValueInitFunc
来设置 value
;例如,对于不允许 NULL
指针的字符串值,它需要发出错误,或通过存储空字符串来执行隐式转换。
传递给此函数的 value
具有零填充的数据数组,因此就像 GTypeValueInitFunc
一样,它保证不包含任何可能需要释放的旧内容。
n_collect_values
参数是 GTypeValueTable
的 collect_format
字段的字符串长度,collect_values
是 GTypeCValue
数组,长度为 n_collect_values
,其中包含根据 collect_format
收集的值。
collect_flags
参数由调用者作为提示提供。它可能包含标记 G_VALUE_NOCOPY_CONTENTS
,表示在 value
生命周期期间收集的值内容可以被视为“静态”。因此,不必为存储在 collect_values
中的内容额外交付一份副本以分配到 value
。
就我们上面的字符串示例而言,我们继续使用
if (!collect_values[0].v_pointer)
value->data[0].v_pointer = g_strdup ("");
else if (collect_flags & G_VALUE_NOCOPY_CONTENTS)
{
value->data[0].v_pointer = collect_values[0].v_pointer;
// keep a flag for the `value_free()` implementation to not free this string
value->data[1].v_uint = G_VALUE_NOCOPY_CONTENTS;
}
else
value->data[0].v_pointer = g_strdup (collect_values[0].v_pointer);
return NULL;
需要注意的是,通常情况下,对引用计数类型的 G_VALUE_NOCOPY_CONTENTS
提示进行遵循都是不好的做法。由于重新进入要求和信号发出代码执行的引用计数断言,应该始终为存储在 value->data
数组中的引用计数内容递增引用计数。以 GObject
的 GTypeValueTable.collect_value()
的示例实现为例,来看离开我们的字符串示例一小会儿
GObject *object = G_OBJECT (collect_values[0].v_pointer);
g_return_val_if_fail (object != NULL,
g_strdup_printf ("Object %p passed as invalid NULL pointer", object));
// never honour G_VALUE_NOCOPY_CONTENTS for ref-counted types
value->data[0].v_pointer = g_object_ref (object);
return NULL;
对象的引用计数始终递增,而与 collect_flags
无关。对于无效对象,示例会返回一个新分配的字符串,而不改变 value
。
成功后,collect_value()
需要返回 NULL
。但是,如果发生错误情况,collect_value()
应返回一个新分配的字符串,其中包含错误诊断。
调用代码对错误返回无效时 value
内容的有效性不做任何假设,value
只是被丢弃,而不需要进一步释放。因此,最好在返回错误之前不对 GValue
内容进行分配;不过,collect_values()
并不一定必须为错误返回返回一个正确设置的 value
,仅仅是因为任何非 NULL
返回都被视为致命编程错误,而程序的进一步行为是未定义的。
自版本 2.78 起可用
参数
value
-
类型:
GValue
要初始化的值。
数据由函数的调用者所有。 n_collect_values
-
类型:
guint
收集的值的数量。
collect_values
-
类型:
GTypeCValue
数组收集的值。
数组的长度在 n_collect_values
参数中指定。数据由函数的调用者所有。 collect_flags
-
类型:
guint
可选标记。