レス数:7 / 状態:未解決 / No:56 / ATOM
1
名前:k
日付:2010/08/31(火)23:58:15
ID:9kJEWPZA4knz
いつもお世話になっています。
イベントリスナーを登録したら、後で削除しないとメモリリークになると聞きましたが、
本当に、全部消す必要があるのでしょうか?
例えば、
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressEvent);
このような関数も、後でちゃんとremoveEventListenerで消さないといけないのでしょうか?
(もしそうなら、結構大変になると思うのですが…。)
ご回答、よろしくお願いします。
イベントリスナーを登録したら、後で削除しないとメモリリークになると聞きましたが、
本当に、全部消す必要があるのでしょうか?
例えば、
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressEvent);
このような関数も、後でちゃんとremoveEventListenerで消さないといけないのでしょうか?
(もしそうなら、結構大変になると思うのですが…。)
ご回答、よろしくお願いします。
2
日付:2010/09/01(水)01:08:26
ID:3MSWtONtnCGU
消したほうがいいけど消さなくても
http://hakuhin.jp/as3/develop.html#DEVELOP_07
http://hakuhin.jp/as3/develop.html#DEVELOP_07
3
日付:2010/09/01(水)01:40:01
ID:JYJaOjE0NUPu
以下の様にガベージコレクションを発生させると
Event.ENTER_FRAME イベントが実行されなくなる事から、
イベントリスナーに関数を登録したままだったとしても、
インスタンスの参照さえ無くなれば開放されるのではないでしょうか。
---------------------------------------------------------
var sprite:Sprite = new Sprite();
sprite.addEventListener(Event.ENTER_FRAME,EnterFrameFunc);
function EnterFrameFunc(e:Event){
trace("call");
}
sprite = null;// インスタンスへの参照を無くす
stage.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent){
// 強制ガベージコレクション
System.gc();
});
Event.ENTER_FRAME イベントが実行されなくなる事から、
イベントリスナーに関数を登録したままだったとしても、
インスタンスの参照さえ無くなれば開放されるのではないでしょうか。
---------------------------------------------------------
var sprite:Sprite = new Sprite();
sprite.addEventListener(Event.ENTER_FRAME,EnterFrameFunc);
function EnterFrameFunc(e:Event){
trace("call");
}
sprite = null;// インスタンスへの参照を無くす
stage.addEventListener(MouseEvent.MOUSE_DOWN,function(e:MouseEvent){
// 強制ガベージコレクション
System.gc();
});
4
名前:k
日付:2010/09/01(水)23:38:49
ID:9kJEWPZA4knz
>>2様
回答ありがとうございます。
ご提示くださったページには、「インスタンスにアクセスできない状態になったとき」と書いてあります。
この場合、loader.load(...);を繰りかえせば、それだけprogressEventも呼び出せると思うのですが、
どうなのでしょうか…?
loader = null; としてしまえばいいのでしょうか?
>>3様
回答ありがとうございます。
おお、確かにクリックした瞬間にenterFrameが止まりますね!
ただ、http://hakuhin.jp/as3/develop.html#DEVELOP_07には、
System.gc()は「デバッグ版の FlashPlayer でのみ動作します。」と書いてありますが、
デバッグ版じゃない場合は、自動的に行われるまで待っていればいいですよね?
回答ありがとうございます。
ご提示くださったページには、「インスタンスにアクセスできない状態になったとき」と書いてあります。
この場合、loader.load(...);を繰りかえせば、それだけprogressEventも呼び出せると思うのですが、
どうなのでしょうか…?
loader = null; としてしまえばいいのでしょうか?
>>3様
回答ありがとうございます。
おお、確かにクリックした瞬間にenterFrameが止まりますね!
ただ、http://hakuhin.jp/as3/develop.html#DEVELOP_07には、
System.gc()は「デバッグ版の FlashPlayer でのみ動作します。」と書いてありますが、
デバッグ版じゃない場合は、自動的に行われるまで待っていればいいですよね?
5
名前:3
日付:2010/09/03(金)02:59:31
ID:JYJaOjE0NUPu
>>4
すみません。
しばらく放置しててもイベントが止まる気配が無いので
以下のソースで検証してみたところメモリ使用量が増加し続ける事が確認できました。
登録したイベントは removeEventListener ですべて開放した方がよさそうです。
---------------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME,EnterFrameFunc);
function EnterFrameFunc(e:Event){
// インスタンス化してローカル変数に格納
var loader:Loader = new Loader();
// 関数を作成してイベントリスナーに登録
var i;
for(i=0;i<0x10000;i++){
loader.addEventListener(Event.ENTER_FRAME,function(e:Event){
// イベントリスナーに登録した関数を破棄
//loader.removeEventListener(Event.ENTER_FRAME,arguments.callee);
});
}
}
すみません。
しばらく放置しててもイベントが止まる気配が無いので
以下のソースで検証してみたところメモリ使用量が増加し続ける事が確認できました。
登録したイベントは removeEventListener ですべて開放した方がよさそうです。
---------------------------------------------------------
stage.addEventListener(Event.ENTER_FRAME,EnterFrameFunc);
function EnterFrameFunc(e:Event){
// インスタンス化してローカル変数に格納
var loader:Loader = new Loader();
// 関数を作成してイベントリスナーに登録
var i;
for(i=0;i<0x10000;i++){
loader.addEventListener(Event.ENTER_FRAME,function(e:Event){
// イベントリスナーに登録した関数を破棄
//loader.removeEventListener(Event.ENTER_FRAME,arguments.callee);
});
}
}
このスレッドについて
質問の状態 : | 未解決 |
投稿開始日 : | 2010/08/31(火)23:58:15 |
投稿終了日 : | 2010/09/05(日)18:33:28 |
投稿者 : | k |
レス総数 : | 7 |
スレッド番号 : | 56 |