慎用CCARRAY_FOREACH

博客内容揭示了在cocos2d-x中使用CCARRAY_FOREACH遍历并删除CCArray对象时可能导致的错误。由于memmove函数在删除元素后会移动后续元素,连续相同标签的精灵可能会被遗漏。建议避免在遍历时删除对象,可使用CCARRAY_FOREACH_REVERSE从后向前遍历作为替代方案。
摘要由CSDN通过智能技术生成

第一次使用CCARRAY_FOREACH遍历一个CCArray数组并且删除数组里的东西时发生出乎意料的结果:
类似代码如下:

CCArray *children = this->getChildren();
CCObject *temp = NULL;
CCARRAY_FOREACH(children, temp)
{
    CCSprite *sprite = dynamic_cast<CCSprite*>(temp);
    if(sprite->getTag() == 1)
    {
        this->removeChild(sprite);
    }
}


这段代码执行下来,发现有些Tag为1的精灵没有被删除,为了查原因,我追查到CCARRAY_FOREACH宏的定义中:
#define CCARRAY_FOREACH(__array__, __object__)                                                                         \
    if ((__array__) && (__array__)->data->num > 0)                                                                     \
    for(CCObject** __arr__ = (__array__)->data->arr, **__end__ = (__array__)->data->arr 
`gst_structure_foreach` 是 GStreamer 中的一个函数,用于遍历 `GstStructure` 中的字段和值。 `GstStructure` 是 GStreamer 中的一个数据结构,用于表示媒体流的元数据。每个 `GstStructure` 包含多个字段,可以通过字段名来访问和操作这些值。 `gst_structure_foreach` 的函数签名如下: ```c void gst_structure_foreach(GstStructure *structure, GstStructureForeachFunc func, gpointer user_data); ``` 参数说明: - `structure`:要遍历的 `GstStructure` - `func`:用于处理每个字段和值的回调函数 - `user_data`:传递给回调函数的用户数据指针 回调函数的定义如下: ```c void (*GstStructureForeachFunc) (const gchar *name, const GValue *value, gpointer user_data); ``` 回调函数有三个参数: - `name`:当前字段的名称 - `value`:当前字段对应的值 - `user_data`:传递给 `gst_structure_foreach` 的用户数据指针 使用 `gst_structure_foreach` 函数,我们可以遍历 `GstStructure` 中的所有字段和值,对它们进行处理。下面是一个示例代码: ```c static void print_field(const gchar *name, const GValue *value, gpointer user_data) { g_print("Field: %s\n", name); // 对当前字段和值进行处理 } // 在某个地方调用 gst_structure_foreach GstStructure *structure = gst_structure_new("my_structure", "field1", G_TYPE_INT, 10, "field2", G_TYPE_STRING, "Hello", NULL); gst_structure_foreach(structure, (GstStructureForeachFunc)print_field, NULL); ``` 在上面的示例中,我们创建了一个名为 "my_structure" 的 `GstStructure`,其中包含两个字段 "field1" 和 "field2"。然后,我们使用 `gst_structure_foreach` 遍历该结构,并将每个字段和值传递给 `print_field` 回调函数进行处理。在回调函数中,我们简单地打印出字段的名称。 通过使用 `gst_structure_foreach`,我们可以方便地遍历 `GstStructure` 中的字段和值,并对它们进行相应的操作。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值