作为解决我们应用程序中的内存泄漏问题的一部分,我们发现默认情况下每个
这意味着当使用静态皮肤部件时,皮肤将永远停留在内存中。此外,在主机组件中覆盖partRemoved()时,它不会被触发。因此,在partAdded()覆盖中添加的事件侦听器不会被移除,这实际上导致视图和皮肤一直保留在内存中。
在频繁进行视图切换时,这是无法接受的。
以下是我们目前解决此问题的示例:
然而,使用
干杯
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
方法来规避这种行为对我来说似乎相当奇怪。关于此的文档也很少,因此任何想法都将非常受欢迎。干杯
skinDestructionPolicy
设置为“auto”。因此似乎没有其他方法,只能使用mx::internal
命名空间来设置该属性。 - RIAstar