zoukankan      html  css  js  c++  java
  • 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会给出警告.
    
    }
  • 相关阅读:
    电脑麦克风不能用
    MathType中带上下标字符不对其
    Visio显示不完整
    程序员美食-煎豆腐
    Visio画好的图在word中只显示一部分
    Visio中旋转文本框与箭头平行
    Tikhonov regularization和岭回归
    linux下使用sftp
    git cherry-pick. 如何把已经提交的commit, 从一个分支放到另一个分支
    python 操作消息队列
  • 原文地址:https://www.cnblogs.com/hehehaha/p/6332612.html
Copyright © 2011-2022 走看看