1

背景

我正在使用 GLib 和变体。

我有这种情况,我想深入了解变体中的值。

初始变体changed_properties的格式为a{sv}.

// Example 1
/* GVariant *variant = g_variant_get_variant(
        g_variant_get_child_value(g_variant_get_child_value(changed_properties, 0), 1));
*/

GVariant *changed_property = g_variant_get_child_value(changed_properties, 0);

// Example 2
GVariant *changed_property_variant = g_variant_get_variant(g_variant_get_child_value(changed_property, 1));
// Unref only frees g_variant_get_variant

// Example 3
GVariant *changed_property_variant_child = g_variant_get_child_value(changed_property, 1);

GVariant *changed_property_variant = g_variant_get_variant(changed_property_variant_child);

// Unref the objects and let reference counter get rid of used memory
g_variant_unref(changed_property_variant);
g_variant_unref(changed_property_variant_child);

我的理解

据我了解,要提取v(这是一个变体),我必须首先从字典{sv}数组中提取第一个。在示例 3 中,我在示例 1中的注释代码之后的sv第一个函数调用中执行此操作。g_variant_get_child_value(changed_properties, 0)

现在我得到了一个形式为{sv}. 要提取变体,我必须再次调用g_variant_get_child_value(changed_property, 1)(其中索引 0 是字符串,索引 1 是{sv}字典中的变体。

问题

调用示例 1示例 2中的函数时会出现此问题。g_variant_get_child_value()从,获得的所有内存引用g_variant_get_variant(),除了最后一次将引用放入变量的调用之外,都将丢失并且不能被取消引用(如示例 3中所示)。

问题

所以我的问题是:如何在不创建这么多对象并通过引用处理这么多内存的情况下深入了解v其内容?GVariant

4

1 回答 1

1

如果您已经获得了 ana{sv}您可能想要查找特定的键(ana{sv}是键值字典的 GVariant/D-Bus 表示)。

为此,请使用GVariantDict,它允许通过字符串键进行索引访问:

g_auto(GVariantDict) dict = G_VARIANT_DICT_INIT (changed_properties);
guint value;
if (!g_variant_dict_lookup (&dict, "key-to-look-up", "u", &value))
  g_error ("key not found");
// value from v is now in `value`

您需要提前知道值的类型,并将其作为格式字符串(第三个参数)传递给g_variant_dict_lookup().

于 2021-10-18T10:03:37.723 回答