【问题标题】:Sprites are visible after removeChild is called调用 removeChild 后精灵可见
【发布时间】:2011-02-17 13:07:43
【问题描述】:

我有一个装有孩子的容器,需要定期更换。这些孩子是精灵,他们有一个用于 MOUSE_DOWN 事件的弱引用事件侦听器。当我对孩子调用 removeChild 时,容器中的 numChildren 减少到 0,但它们在 flash 中仍然可见。我什至试图删除容器并重新创建一个新容器,但它仍然不起作用。还尝试添加一些虚拟的简单精灵,没有任何事件侦听器,但没有带来任何结果。我认为垃圾收集器没有按我的意愿工作:)

这是我创建精灵的代码:

itemHolder=new Sprite();
addChild(itemHolder);
itemHolder.y=itemHolderY;

var itemY:Number=0;

for(var i:Number=0;i<modelBarList.bars.length;i++){
    var item:bar_list_item;
    item=new bar_list_item();
    item.name="item"+i;
    /*
    setting properties for item
    */
    itemHolder.addChild(item);              
    item.y=itemY;
    item.mouseChildren=false;
    item.buttonMode=true;
    itemY+=item.height;
    item.addEventListener(MouseEvent.MOUSE_UP,barSelected,false,10,true);
}

以及删除代码:

while(itemHolder.numChildren){
    var item:Sprite=Sprite(itemHolder.getChildAt(0));
    item.removeEventListener(MouseEvent.MOUSE_UP,barSelected,false);
    itemHolder.removeChild(item);
    item=null;
}
removeChild(itemHolder);
itemHolder=null;

【问题讨论】:

    标签: actionscript-3 garbage-collection sprite removechild


    【解决方案1】:

    我认为这与垃圾收集器无关。您是否 100% 确定第二个代码中的 itemHolder 与第一个代码中的 itemHolder 相同?也许您可以尝试将trace("Yep, this code executes") 添加到第二个 sn-p 并查看它是否确定执行?那,或者我认为问题出在您的代码中的其他地方。

    【讨论】:

    • 是的,我确定它是同一个 itemHolder,因为它被定义为类属性(两个代码都来自同一个类),并且它在 while 循环之前和之后有 10 个 numChildren。
    • 嗯。然后尝试移动 itemHolder 而不是在第二个代码中删除它,看看是否有任何变化,并测试它的可见性和 alpha。此外,您确定该类没有实例化两次,因此您最终得到了两组 itemHolders,其中只有一组被删除?
    • 稍微移动 itemHolder 而不是移除的好主意。它显示下面确实还有另一个 itemHolder。所以我回溯并意识到在场景中添加所有元素的方法被调用了两次。该函数是我的错误分派两次的事件的事件处理程序。我进行了一些重构并忘记删除 dispatchEvent 但仅适用于此类...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多