昨天同事说可能CCCallFuncND也出列点问题,后来我看了一下,顺便查了一下有关CCCallFuncND的定义,在cocos2d中的:
CCCallFuncND *callFun = [CCCallFuncND actionWithTarget:(id) selector:(SEL) data:(void *)];
其中的(void *)也就是所谓的void指针引起了我的兴趣,以前一直用,只知道它是一个可以指向任何类型的数据指针,但从来没有想过为什么会是这样,后来查了有关资料,才高明白。
我们知道一个指针有两个属性:指向变量或对象的“地址”和“长度”,但是指针只存储“地址”,长度则取决于指针的类型。编辑器根据指针的类型从指针的“地址”向后寻址,指针不同,则寻址范围也不同,比如:int * 从指定地址向后寻址4个字节作为变量的存储单元(编译器不同可能有些出入);double * 则从指定的地址向后寻址8个字节作为变量的存储单元。对于void指针有如下特点:
1、void指针是特别的指针,因为它没有类型,也就是我们不知道其长度.;
void *vp;
2、任何指针都可以赋值给void指针;
type *tp;
vp = tp;//不需要转换
//只获得tp的地址
3、void指针转赋值给其他类型的指针时需要转换;
type *tp = (type *)vp;//这样便获得了地址和长度
4、void指针不能复引用,因为void指针并不知道指针的长度;
*vp;//错误的
5、void指针不能参加指针运算,除非先对其进行转换。
对于CCCallFuncND的void指针我们通过以下两个例子就会很明白它是怎么使用的。
例子1:
NSString *s = @"hhhhhhh"; CCCallFuncND *cafnd = [CCCallFuncND actionWithTarget:self selector:@selector(callback:data:) data:s ]; - (void)callback(id)sender data:(void *)data { NSString *str = (NSString *)data; // 我们可以将void指针转换为NSString. }
例子2:
int temp = 100; CCCallFuncND *cafnd = [CCCallFuncND actionWithTarget:self selector:@selector(callback:data:) data:(void *)temp ];//这里不加一个转换xcode会给出警告. - (void)callback(id)sender data:(void *)data { int t = (int)data; //如果不转换xcode会给出警告. }