作为尝试解决应用程序中内存泄漏的一部分,我们发现对于每个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
方式来规避这种行为对我来说似乎很奇怪。关于这方面的文档也很少,所以任何想法都会受到欢迎。
干杯