CCCallFuncND的void指针的理解

最近游戏游戏做了内存测试,一堆内存泄露,看了头就大,只怪当初写代码的时候没好好写,现在那个后悔啊!

昨天同事说可能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会给出警告.

}

 

posted on 2012-06-12 11:23  疯子123  阅读(146)  评论(0编辑  收藏  举报

导航