如何在运行时为Cocos2D CCMenu menuWithItems动态创建va_list?

时间:2012-02-14 20:00:24

标签: iphone c cocos2d-iphone variadic-functions

我在CCMenu课上度过了一段难忘的时光。要使用此类创建菜单,它会强制您调用名为initWithItems的方法,该方法采用va_list。我需要在运行时生成这个列表,并且我读到创建一个C数组并传递它可以像va_list一样起作用,只是它失败了。

我在va_list中有一个我想要的NSArray项目,这些项目是CCMenuItem的SUBCLASS,这是menuWithItems期望在va_list中的类。如果你在编译时硬编码这个列表,它工作正常,但我动态创建这个列表的尝试不起作用。这有什么问题? MenuItemButton是一个CCMenuItem子类。

NSArray *menuItems = [self getMenuItemsArray]; // Returns an NSArray of MenuItemButtons 
MenuItemButton *argList = (MenuItemButton *)malloc( sizeof(MenuItemButton *) * [menuItems count] );
[menuItems getObjects:(id *)argList];
CCMenuAdvanced* menu = [CCMenuAdvanced menuWithItems:argList];

这在运行时崩溃,BAD_ACCESS。我知道va_list应该是null终止的,我不知道在调用getObjects之后我的代码是否就是这种情况,或者甚至是问题。

2 个答案:

答案 0 :(得分:2)

您可以使用nil简单地初始化菜单。例如,

CCMenu * myMenu = [CCMenuAdvanced menuWithItems:nil];

然后说你有一个动态的字符串列表,你在运行时加载,尝试....

// replace this with a dynamically loaded array of items...
NSArray* dynamicArray = [NSArray arrayWithObjects:@"red", @"blue", @"green", nil];


for (NSString* item in dynamicArray)
{
    CCMenuItem *menuItem = [CCMenuItemFont itemFromString: item target: self     selector:@selector(menuCallback:)];
    [myMenu addChild:menuItem];
}

答案 1 :(得分:0)

va_list并不总是数组。对于32位gcc,它是64位而不是。不要依赖它。

va_list由获取可变数量参数的函数生成:

#include <stdarg.h>
void f(int x, ...) {
    va_list va;
    va_start(va, x);
    function_that_wants_va(va);
    va_end(va);
}
void g(void) {
    f(1,2,3,4);
}