0

Xcode のエラー: send CGPoint (aka 'struct CGPoint') to parameter of incompatible 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{

}

このエラーの原因は何ですか?

4

1 に答える 1

1

CCCallFuncND は構造体型では機能しません (また、ARC でもうまく機能しません)。

代わりに、はるかに簡単で強力なブロック版を使用してください。

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

CGPoint参考までに、エラーは、タイプをタイプに割り当てようとしたためですvoid*。CGPoint のアドレスをアドレス演算子 ( &posSending) で渡して使用したとしても、handleTail メソッドでガベージを受け取ります。そのメソッドが呼び出されるまでに、posSending へのポインターは有効ではなくなります。これは、posSending がスタック上に作成されたためです。

CGPoint の malloc が機能すると考える人もいるかもしれませんが、これは安全ではありません。なぜなら、(シーンの変更や stopAction の呼び出しにより) handleTail メソッドが呼び出されるという保証がないからです。したがって、受信側のメソッドがその malloc されたポインターを実際に解放できるという保証はありません。

さらに、handleTail メソッドが正しく宣言されておらず、void* パラメータを受け取ります。

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

これらすべての 1 つのポイント: いつでもどこでも、ブロックを使用します。

于 2013-03-02T23:24:27.080 に答える