我在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之后我的代码是否就是这种情况,或者甚至是问题。
答案 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);
}