PDA

Просмотр полной версии : Утечка


AlexCooper
17.03.2012, 20:27
Доброго время суток.
На ранних этапах обнаружил утечку, при вызове метода show() в представленном ниже классе убегает примерно 3Kb (за каждый повторяющий вызов функции методом levelup и leveldown), это видно с диспетчера задач. Помогите с оптимизацией, или посмотрите что может так.

package src {

import flash.display.Sprite;
import flash.events.Event;
import flash.events.MouseEvent;
import flash.display.Loader;
import flash.net.URLRequest;
import gs.TweenLite;
import gs.easing.*
import flash.filters.BlurFilter;

public class photoTree extends Sprite {

public var me:Boolean = false;
public var language:Object;

private var tree:Array;
private var sector:Array = new Array();
private var back:Array = new Array();
private var turn:Array = new Array();

private var smallSize:Number = 105;
private var bigSize:Number = 200;



public function photoTree() {

if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE,init);
}

private function init(e:Event=null):void
{
removeEventListener(Event.ADDED_TO_STAGE,init);
if (tree)
{
back.push("tree");
sector = tree;
x = 100;
y = 90;
_back.visible = false;
_home.visible = false;

_back.addEventListener(MouseEvent.MOUSE_UP,levelup);
_home.addEventListener(MouseEvent.MOUSE_UP,levelup);

var blur = new BlurFilter(2, 2, 2);
_lines.filters = [blur];

if (me)
{
_favorites.visible = false;
_like.visible = false;
_gift.visible = false;
}

for ( var i=0; i<=5; i++)
{
this['cast'+i]._edit.visible = me;
this['cast'+i]._edit._text.text = language.edit;
this['cast'+i]._over.addEventListener(MouseEvent.ROLL_OVER,showAlert);
this['cast'+i]._over.addEventListener(MouseEvent.ROLL_OUT,hideAlert);
this['cast'+i]._over.addEventListener(MouseEvent.MOUSE_UP,leveldown);

}
show();
}
}
private function levelup(e:MouseEvent):void
{
back.pop();
sector = this[back.join(".")];

show();
}



private function leveldown(e:MouseEvent):void
{
var len:uint = 0;
for (var item in sector[e.target.parent.name]) len++;

if (len>3)
{
back.push(e.target.parent.name);
sector = sector[e.target.parent.name];
show();
}
}

public function reset():void
{
trace('reset photoTree');
for ( var i=0; i<=5; i++)
{

this['cast'+i]._over.removeEventListener(MouseEvent.ROLL_OVER,showAlert);
this['cast'+i]._over.removeEventListener(MouseEvent.ROLL_OUT,hideAlert);
this['cast'+i]._over.removeEventListener(MouseEvent.MOUSE_UP,leveldown);
}
}

private function alphaMover(e:Event):void
{

if ((e.target.astep>0 && e.target.alpha>=1) || (e.target.astep<0 && e.target.alpha<=0))
e.target.removeEventListener(Event.ENTER_FRAME,alphaMover);
else e.target.alpha+=e.target.astep;

}

private function showAlert(e:MouseEvent):void
{
e.target.parent.parent["alert_"+e.target.parent.name].astep = 0.05;
e.target.parent.parent["alert_"+e.target.parent.name].addEventListener(Event.ENTER_FRAME,alphaMover);
}

private function hideAlert(e:MouseEvent):void
{
e.target.parent.parent["alert_"+e.target.parent.name].astep = -0.1;
e.target.parent.parent["alert_"+e.target.parent.name].addEventListener(Event.ENTER_FRAME,alphaMover);
}

public function set content(data:Array):void
{
tree = data;
if (stage) init();
}

private function resize(e:Event):void
{
if(e.target.width>0)
{
e.target.removeEventListener(Event.ENTER_FRAME, resize);

var size = (e.target.parent.parent.name=='photo') ? bigSize : smallSize;

if(e.target.width!=size) e.target.width = e.target.height = size;

if (turn.length!=0) loading();
}
}

private function loading():void
{
var loader:Loader = new Loader();
loader.load(new URLRequest(turn[0]))

this[turn[1]].photo.img.addChild(loader);
this[turn[1]].photo.img.addEventListener(Event.ENTER_FRAME, resize);

turn.shift();
turn.shift();
}

private function show():void
{

_back.visible = (back.length>=2) ? true : false;
_home.visible = (back.length>2) ? true : false;

_head.text = sector.head;

turn[0] = sector.photo;
turn[1] = 'photo';

for ( var i = 0; i < 6; i++ )
{
turn[turn.length] = sector['cast'+i].photo;
turn[turn.length] = 'cast'+i;

this['alert_cast'+i]._head.text = sector['cast'+i].head;
this['alert_cast'+i]._body.text = sector['cast'+i].comment;
this['alert_cast'+i]._help.text = language['help'];

/*var X:Number = this['cast'+i].x;
var Y:Number = this['cast'+i].y;

this['cast'+i].x = 208;
this['cast'+i].y = 94;

this['cast'+i].alpha = 0;
this['cast'+i]['_cast'+i].alpha = 1;
TweenLite.to(this['cast'+i], 1, {x:X, y:Y, ease:Back.easeInOut, alpha:1});*/
}
loading();
}
}
}


Добавлено через 19 минут
Спасибо уже сам нашёл))

нужно было сделать так

private function loading():void
{
var loader:Loader = new Loader();
loader.load(new URLRequest(turn[0]))


while(this[turn[1]].photo.img.numChildren) this[turn[1]].photo.img.removeChildAt(0);

this[turn[1]].photo.img.addChild(loader);
this[turn[1]].photo.img.addEventListener(Event.ENTER_FRAME, resize);

turn.shift();
turn.shift();
}