0

这是我点击按钮的代码。它将 myView 添加到容器中。并注意在再次添加之前删除所有先前的实例。我想知道,是否有更好的方法来做这个“检查”?我特别想有一些方法来删除这段代码的 1s 7 行(在评论中)。它似乎是正常代码流中不相关的代码块。

function button_CLICK(e:Event)
{
///////////////////////////////////////////////////
            if ( myView!= null)
            {
                if ( contains(myView))
                {
                    removeChild(myView) ;
                }
            }
/////////////////////////////////////////////////////
            myView = new myView("hello")
            addChild(myView);

}
4

5 回答 5

0

您拥有的检查代码可能会造成内存泄漏,因为在创建新实例之前您不会将之前的 myView 设为空。注意。最好以大写字母开头类的名称。

您的代码似乎还允许在添加 myView 时调用 button_CLICK 方法。也许考虑在添加视图后隐藏按钮。

您可以只实例化 MyView 类的一个实例。然后,不必每次都为 null 并创建一个新实例,只需添加相同的实例并添加一个将接受初始化参数的 init 函数。例如

var myView = new MyView();

function button_CLICK(e:Event)
{
if ( contains(myView))
{
removeChild(myView) ;
}
}
myView.init("hello");
addChild(myView);

}
于 2012-05-27T10:18:30.973 回答
0

这将取决于对象myView由什么组成。例如,如果它有自己的事件侦听器,您可能希望在处理对象之前使用条件检查来清理对象,以免内存泄漏。

function button_CLICK(e:Event):void
{
    if (myView && contains(myView))
    {
        //clean up myView

        removeChild(myView);
    }

    myView = new myView("hello");
    addChild(myView);
}

但是,如果myView是一个简单的显示对象,它不包含任何可泄漏的引用或事件侦听器,那么您可以简单地重新分配变量以覆盖以前的变量。

请记住,addChild()将添加的显示对象置于所有其他对象之上。但无论您是否想避免这种情况,我相信最好分配一次默认或空视图,而不是addChild(myView)每次单击按钮时。

function button_CLICK(e:Event):void
{
    myView = new myView("hello");
}

我假设您的代码用于演示,因为new myView("hello")将始终是同一个对象?除非这个对象可能依赖日期或计时器来使实例与以前的构造不同。

于 2012-05-27T18:17:34.220 回答
0

基于 DisplayObjectContainer 的(IMO)有缺陷的实现,我认为您没有太多选择。如果您感觉很生气,您可以在调用 super 方法之前“修复” removeChild 以查看孩子是否存在,而不是像 Adob​​e 认为的那样简单地抛出错误是合适的解决方案。

您上面的代码仍将运行,但它将位于 removeChild 覆盖中。

于 2012-05-28T02:03:08.503 回答
0

您注释的代码块仅在第一次调用时是必需的button_CLICK(您应该重命名此方法:)buttonClick。在第一次调用之后,这组代码是不必要的。为了删除这个代码myView不应该,并且应该在显示列表中添加null一个实例。MyView

var myView : MyView;

function init(){
   myView = new MyView("FAKE");
   myView.visible = false;
   addChild(myView);
   addEventListener("click",click);
}

function click(e:MouseEvent):void{
   removeChild(myView);
   myView = new Child("REAL");
   addChild(myView);
}
于 2012-05-28T07:55:58.957 回答
0

尝试:

if(myView != null)
    myView.parent && myView.parent.removeChild(myView);
于 2012-05-28T08:07:52.327 回答