方法

GLibVariantIterloop

以来:2.24

声明 [源代码]

gboolean
g_variant_iter_loop (
  GVariantIter* iter,
  const gchar* format_string,
  ...
)

描述 [源代码]

获取容器中的下一个项目并将其按 format_string 解包到变量参数列表中,返回 TRUE

如果没有更多项目,则返回 FALSE

在首次调用此函数时,假设变量参数列表中出现的指针指向未初始化的内存。在第二次及以后的调用中,假设将给出相同的指针,并且它们将指向由前一次调用此函数设置的内存。这允许适当地释放前一个值。

此函数旨在与以下示例中的 while 循环一起使用。此函数只能用于迭代数组。只有用字符串常量作为格式字符串,并且必须每次使用相同的字符串常量。在同一个迭代器上混合对 g_variant_iter_nextg_variant_iter_next_value 的调用会导致未定义的行为。

如果您使用 g_variant_iter_loop 跳出此类 while 循环,则必须释放或取消引用所有解包值,就像使用 g_variant_get() 一样。否则,将导致内存泄漏。

以下是一个使用 g_variant_iter_loop 的内存管理示例

  // Iterates a dictionary of type 'a{sv}'
  void
  iterate_dictionary (GVariant *dictionary)
  {
    GVariantIter iter;
    GVariant *value;
    gchar *key;

    g_variant_iter_init (&iter, dictionary);
    while (g_variant_iter_loop (&iter, "{sv}", &key, &value))
      {
        g_print ("Item '%s' has type '%s'\n", key,
                 g_variant_get_type_string (value));

        // no need to free 'key' and 'value' here
        // unless breaking out of this loop
      }
  }

对于大多数情况,您应该使用 g_variant_iter_next

此函数真正有用的时机是将值解包到 GVariantGVariantIter,以便允许您跳过对 g_variant_unref 或 g_variant_iter_free() 的调用。

例如,如果您只遍历简单的整数和字符串类型,则 g_variant_iter_next 一定是首选。对于字符串类型,使用“&”前缀以避免分配任何内存(因此也不需要释放任何内容)。

format_string 确定用于解包值的 C 类型,并确定值是被复制还是借用。

有关 GVariant 格式字符串 的详细信息,请参阅该部分。

以来:2.24

此方法对语言绑定不可直接使用。

参数

format_string

类型: const gchar*

一个 GVariant 格式字符串。

数据由方法调用者所有。
值是一个以 NULL 结尾的 UTF-8 字符串。
...

类型: 

解包值的目标参数。

返回值

类型: gboolean

TRUE 如果已解包值,或者 FALSE 如果没有值。