在CCCallFuncND中将“CGPoint”发送到不兼容类型的参数

时间:2013-03-02 23:18:28

标签: objective-c cocos2d-iphone

Xcode中的错误读取:将CGPoint(又名'struct CGPoint')发送到不兼容类型的参数'void *'

我正在做的是:

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

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

}

导致此错误的原因是什么?

1 个答案:

答案 0 :(得分: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的CGPoint会起作用,而且确实如此 - 然而它使用起来并不安全,因为无法保证会调用handleTail方法(由于场景更改或stopAction调用) 。因此,不能保证接收方法实际上可以释放该malloc指针。

此外,您的handleTail方法声明不正确,它会收到一个void *参数:

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

所有这一切,一条道路:随时随地使用街区。