0

私はこのスプライトをinitメソッドに入れています

lineDrawer = [[LineDrawer alloc]initWithLineColor:ccc3(color.r, color.g, color.b)];
lineDrawer.position = ccp(0,0);
lineDrawer.anchorPoint = ccp(1,1);

[self addChild:lineDrawer];
[self addChild:head];

[lineDrawer release];

ここで何も悪いことはありませんか?addchildがオブジェクトを保持しているので、リリースできます。(自動リリースもOKです)

私がリリースを持っているとき、私は後でEXC_BAD_ACCESS(code = 1)を取得しますが。また、リリースをdeallocメソッドに移動しようとしましたが、同じエラーが発生します。

lineDrawerを参照する唯一のオブジェクトは、それが定義されているspriteobject(Player:CCSprite)であり、ゲッターがないため、別のオブジェクトからアクセスすることもできないため、これがどのように発生するかわかりません。所有者だけがそれへの参照を持っているとき、それは割り当て解除されます。

これは、CCLayerのdrawメソッド内のCC_NODE_DRAW_SETUP()行で発生します。

ヒントはありますか?これらの質問はコードがないために解決するのが常に難しいことを私は知っていますが、どのコードを表示するかを知ることは本当に難しいです。自分で解決できるとわかっていれば。インストルメントでこれをデバッグしようとしましたが、どこを見ればよいかわかりません。

更新、ゾンビを有効にしてデバッグしてみました

これが結果です

これはあなたに何か言いますか?これはLineDrawerクラスです。私が少し変更したのは他の誰かのクラスです。

http://pastebin.com/7Uv4GULy
http://pastebin.com/08NHeVt9

なんらかの方法で予定されているような気がします。

4

2 に答える 2

1

lineDrawerオブジェクトをの子コレクションに追加するので、オブジェクトへのCCSpriteパブリック参照はで.children定義されたプロパティを介して利用できますCCNode

ただし、投稿したコードの何も間違っているようには見えませんが、LineDrawer継承元であり、...の子として使用するように設計されたものではCCLayerないと思います...実際にはPlayerオブジェクトの子である必要がありますか?(たとえば、プレーヤースプライトが移動および回転するときに、それを追跡する必要がありますか?)通常、レイヤーはアクティブノードまたは別のレイヤーの子です。CCLayerCCSpriteCCScene

于 2012-08-03T00:25:06.963 に答える
0

ARCを使用している場合、これらの問題のほとんどは発生しなくなります。

ほとんどの場合、オブジェクトをオーバーリリースしました。必ずしもlineDrawerである必要はありません。おそらく、それはlineDrawerクラス内のオブジェクトです。

これを理解する最良の方法は、ビルドスキームでNSZombieObjectsを有効にして、アクセスされたオブジェクトを見つけることです。

于 2012-08-02T23:21:47.843 に答える