作为尝试解决我们应用程序内存泄漏的一部分,我们发现对于每个 SkinnableComponent
,skinDestructionPolicy
都设置为 "never"
默认。
这意味着当使用静态皮肤部件时,皮肤将永远保留在内存中。
此外,永远不会触发宿主组件中 partRemoved() 的覆盖。
因此,我们在 partAdded() 覆盖中添加的事件监听器不会被删除,这有效地导致 View 和皮肤保留在内存中。
当进行大量 View 切换时,这是 Not Acceptable 。
这是我们现在如何解决此问题的示例:
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
方法来规避这种行为对我来说似乎很奇怪。
关于这方面的文档也很少,所以任何想法都将非常受欢迎。
干杯
最佳答案
根据我对 mx::internal
的使用经验Flex SDK 中的命名空间通常意味着:“您可以使用此功能,如果您知道自己在做什么,我们(Adobe,或 future 的 Apache 社区)不保证此 API 在未来的 Flex 版本中永远不会改变。
所以它的使用没有真正的问题,除非你非常关心向后兼容性。如果你真的想避免使用它,你总是可以实现 skinDestructionPolicy="auto"
的行为。在你的子类中。没有那么多代码要写:
override public function initialize():void {
addEventListener(Event.ADDED_TO_STAGE, addedToStageHandler);
addEventListener(Event.REMOVED_FROM_STAGE, removedFromStageHandler);
super.initialize();
}
private function addedToStageHandler(event:Event):void {
if (skin == null) attachSkin();
}
private function removedFromStageHandler(event:Event):void {
detachSkin();
}
请注意,在 SkinnableComponent
中在 commitProperties()
中附加这两个事件监听器类(或不附加,取决于策略)方法。我把它移到了 initialize()
方法,因为我们不需要检查 skinDestructionPolicy
中的更改属性(property)了。
另请注意,如果有人确实设置了mx::internal skinDestructionPolicy
,此解决方案可能会导致错误至 "auto"
旁边。
关于apache-flex - Spark SkinnableComponent skinDestructionPolicy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8150934/