‘Progression’ タグのついている投稿

addCommand内での参照

2009年1月24日 土曜日

ProgressionのaddCommand内で、下記コードのように、AddChildする_mcのnewを同じaddCommand内のFuncコマンドで行うと、AddChildコマンド実行時の_mcがnullとなりエラーになってしまう。

  1. private var _mc:MovieClip;
  2.  
  3. private function _init():void
  4. {
  5.     _mc = new MovieClip();
  6. }
  7.  
  8. protected override function _onCastAdded():void
  9. {
  10.     addCommand
  11.     (
  12.         new Func( _init ),
  13.         new AddChild( this, _mc )
  14.     );
  15. }

タイミング的な問題なのか、スコープの問題なのか、いろいろ条件を変えて試してみたけど上手くいかずハマっていたので、Twitterで聞いてみたところ、『addCommand内の参照は、addCommandする時点の参照になる』と教えてもらうことができた。
なるほど。
addCommandした時点にnullなので、addCommand内のFuncコマンド内でnewしても、nullだった頃の_mcが参照されているということの模様。
タイムマシン的。

次のように書き換えて解決。
_onCastAdded時に_initメソッドでインスタンス化、_onCastRemoved時に(例えば)_finalメソッドで明示的にnullにしてメモリリークしないように気をつけようと思ったので、初期化処理から配置まで一連の流れをひとつのaddCommandに書けたらスッキリするのになぁと思いつつなのだけど。

  1. private var _mc:MovieClip;
  2.  
  3. private function _init():void
  4. {
  5.     _mc = new MovieClip();
  6. }
  7.  
  8. protected override function _onCastAdded():void
  9. {
  10.     _init();
  11.     addCommand( new AddChild( this, _mc ) );
  12. }

ところで、解決方法を模索しているとき、Commandクラスにscopeというプロパティを見つけた。
ASDocではtimeOutのコメントがコピペされていたw
ソースを辿っていくと、Functionクラスのapplyメソッド第一引数に渡されているので、コマンドを別オブジェクトで実行できそう?
コマンド伝播ができない場合に有効だったりしないかな??
時間があるときに検証してみたいと思う。