【问题标题】:Sending 'CGPoint" to parameter of incompatible type in CCCallFuncND向 CCCallFuncND 中不兼容类型的参数发送“CGPoint”
【发布时间】:2013-03-02 23:18:27
【问题描述】:

Xcode 中的错误为:sending CGPoint (aka 'struct CGPoint') to parameter of in compatible type 'void *'

我正在做的是:

CCSprite* coordinate= path[i];
CGPoint posSending = coordinate.position;
id handleTail = [CCCallFuncND actionWithTarget:self selector:@selector(handleTail:)data:posSending];

//handleTail
-(void)handleTail:(CGPoint)pos{

}

是什么导致了这个错误?

【问题讨论】:

    标签: objective-c cocos2d-iphone


    【解决方案1】:

    CCCallFuncND 不适用于结构类型(也不适用于 ARC)。

    改为使用块版本,更简单,更强大:

    CGPoint posSending = coordinate.position;
    id handleTail = [CCCallBlock actionWithTarget:self block:^{
        // do something with posSending:
        someNode.position = posSending;
    }];
    

    仅供参考,错误是因为您尝试将 CGPoint 类型分配给 void* 类型。即使您确实通过地址运算符 (&posSending) 使用了 CGPoint 的地址,您也会在您的 handleTail 方法中收到垃圾。在调用该方法时,指向 posSending 的指针不再有效,因为 posSending 是在堆栈上创建的。

    有人可能认为 malloc'ing CGPoint 会起作用,但确实如此 - 但是使用起来并不安全,因为无法保证会调用 handleTail 方法(由于场景更改或 stopAction 调用) .因此,不能保证接收方法实际上可以释放那个 malloc 的指针。

    另外,你的handleTail方法声明不正确,它接收到一个void*参数:

    -(void)handleTail:(void*)data
    {
    }
    

    所有这一切,一个要点:随时随地使用积木。

    【讨论】:

    • 另一种解决方案是使用 NSValue 来包装 CGPoint。但我宁愿去阻止
    • 你的意思是 '[CCCallBlock actionWithBlock:^{ ??Stuff..'}];?
    • 不,没有东西。块不需要东西。在块内,您可以使用范围内的任何变量,例如 posSending。无需将其作为参数传递。如果您需要修改它,请在变量声明前添加 __block: __block CGPoint send; ……阅读:developer.apple.com/library/ios/#documentation/cocoa/Conceptual/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-07
    相关资源
    最近更新 更多