В рамках попытки устранения утечки памяти в нашем приложении мы обнаружили, что для каждого SkinnableComponent
значение skinDestructionPolicy
по умолчанию равно "never"
.
Это означает, что при использовании статичных частей кожи кожа всегда остается в памяти.
Кроме того, переопределение partRemoved () в хост-компоненте никогда не будет запущено.
Следовательно, прослушиватели событий, которые мы добавляем в переопределение partAdded (), не удаляются, что фактически приводит к тому, что представления и оболочки сохраняются в памяти.
При выполнении большого количества переключений вида это просто недопустимо.
Вот пример того, как мы сейчас работаем над этим:
public class ViewA extends SkinnableComponent
{
[SkinPart(required = "true")]
public var labelA:Label;
[SkinPart(required = "true")]
public var buttonA:Button;
public function ViewA()
{
super();
mx_internal::skinDestructionPolicy = 'auto';
}
override protected function getCurrentSkinState():String
{
return super.getCurrentSkinState();
}
override protected function partAdded(partName:String, instance:Object):void
{
super.partAdded(partName, instance);
trace("ViewA::partAdded " + partName);
if (instance == buttonA)
{
buttonA.addEventListener(MouseEvent.CLICK, buttonClickedHandler);
}
}
override protected function partRemoved(partName:String, instance:Object):void
{
trace("ViewA::partRemoved " + partName);
if (instance == buttonA)
{
buttonA.removeEventListener(MouseEvent.CLICK, buttonClickedHandler);
}
super.partRemoved(partName, instance);
}
override public function stylesInitialized():void
{
setStyle("skinClass", ViewASkin);
}
}
Однако использование mx::internal
способа обойти это поведение кажется мне довольно странным.
Документация по этому вопросу также недостаточна, поэтому любые идеи будут очень кстати.
Приветствия