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会给出警告.

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值