方法
GLibVariantIterloop
以来:2.24
声明 [源代码]
gboolean
g_variant_iter_loop (
GVariantIter* iter,
const gchar* format_string,
...
)
描述 [源代码]
获取容器中的下一个项目并将其按 format_string
解包到变量参数列表中,返回 TRUE
。
如果没有更多项目,则返回 FALSE
。
在首次调用此函数时,假设变量参数列表中出现的指针指向未初始化的内存。在第二次及以后的调用中,假设将给出相同的指针,并且它们将指向由前一次调用此函数设置的内存。这允许适当地释放前一个值。
此函数旨在与以下示例中的 while 循环一起使用。此函数只能用于迭代数组。只有用字符串常量作为格式字符串,并且必须每次使用相同的字符串常量。在同一个迭代器上混合对 g_variant_iter_next
或 g_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
。
此函数真正有用的时机是将值解包到 GVariant
或 GVariantIter
,以便允许您跳过对 g_variant_unref
或 g_variant_iter_free() 的调用。
例如,如果您只遍历简单的整数和字符串类型,则 g_variant_iter_next
一定是首选。对于字符串类型,使用“&”前缀以避免分配任何内存(因此也不需要释放任何内容)。
format_string
确定用于解包值的 C 类型,并确定值是被复制还是借用。
有关 GVariant
格式字符串 的详细信息,请参阅该部分。
以来:2.24
此方法对语言绑定不可直接使用。