0

これがluaのサンプルです

for i=1,n do
    cclog(""..i)
    someItem:runAction(CCCallFunc:create(someCallback))
end

そのため、最初にコンソールログにn行が出力iされ、次に実行runAction n時間が実行されるため、デバッグ出力は次のようになります

1
2
3
4
...
n
someCallback
someCallback
someCallback
someCallback
...
someCallback

それは一種のメモリリーク保護ですか、それともバグですか

4

1 に答える 1

1

バグではありません。何が起こるかというと、呼び出し時に作成して実行するアクションは

someItem:runAction(CCCallFunc:create(someCallback))

someItem のアクション マネージャに追加されます。これは、ノードで実行されるすべてのアクションで発生します。デフォルトでは、新しいノードのアクション マネージャはディレクタから取得されるため、デフォルトではすべてのノードが同じアクション マネージャを共有します。runAction の呼び出し中は、これ以上のことは起こりません。これらのアクションは、後でアクション マネージャーが更新されると更新されます。ディレクターのアクション マネージャーは、フレームごとに 1 回更新されるように設定されています。「someCallback」出力を取得するのはこの更新中です。これが、出力が cclog(""..i) の出力の後に来る理由です。

CCCallFunc アクションは、実行直後に削除されます。CCMoveTo などのその他のアクションは、アクション マネージャーに長期間保持されます。アクション マネージャーを更新するたびに、アクション自体が更新され、削除する必要があるかどうかがチェックされます。CCCallFunc が行うことは、更新時にコールバックを呼び出し、アクション マネージャーが要求したときに終了したことを伝えることです。したがって、コールバックはアクションごとに 1 回だけ呼び出され、その後アクションは削除されます。

お役に立てれば。:)

于 2013-04-30T06:52:27.813 に答える