gpt4 book ai didi

apache-flex - Spark SkinnableComponent skinDestructionPolicy

转载 作者:行者123 更新时间:2023-12-05 04:18:53 24 4
gpt4 key购买 nike

作为尝试解决我们应用程序内存泄漏的一部分,我们发现对于每个 SkinnableComponentskinDestructionPolicy 都设置为 "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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com