我正在尝试以下代码,因此每当我将movieclip设为null时,包含它的引用的数组也会变为null。
我理解以下代码不能这样做,但我想以某种方式,如果movieclip已经为null,数组可以提供信息。有什么好办法吗?有什么建议吗?
import flash.display.MovieClip;
import flash.events.Event;
var a_arr:Array = new Array(a_Mc,b_Mc);
trace(a_arr);
a_Mc= null ;
trace(a_arr);
//output is:
//[object MovieClip],[object MovieClip]
// ==>>>> but i want something like null,[object MovieClip ]
答案 0 :(得分:3)
这种方式不可能,因为变量a_MC
只是指向对象的指针。但是你可以这样做:
var a_arr:Array = [a_Mc, b_Mc]; // use [] instead of new Array()
a_arr[0] = null;
trace(a_arr);
这会将数组指针值更改为null。
您还可以在MovieClip对象上使用自定义属性,因为它们是动态类(与Sprites不同)
var a_arr:Array = [a_Mc, b_Mc];
a_Mc.alive = true;
b_Mc.alive = true;
// change the custom property
a_Mc.alive = false;
// later detect this and solve
if (a_arr[0].alive){
trace("ALIVE!");
}
答案 1 :(得分:2)
我对AS3的了解非常生疏,但由于这个问题的性质对于任何编程实践都很普遍,我仍然会尝试以独立于语言的方式回答。如果AS3提供了实现你想要的特定机制,我的解决方案可能不是最好的,但你必须听取其他人的意见。
从通用编程的角度来看,基本问题是指向同一对象的多个引用彼此不了解。将其中一个引用分配给null只会重定向此一个变量的指向,它不会通知其他有关更改的引用,并且通常不会更改对象本身的状态,因此其他引用仍然指向该对象。您希望赋值为null表示“释放此对象并使语句的所有引用无效”,但由于垃圾收集机制,它不会发生。
处理这种情况的正确方法是以正确的方式使用引用 - 如果您希望对象消失,请将对它的所有引用设置为null。但是,根据你在你的情况下想要做什么(我感觉你正试图做一些稍微不正统的事情),这可能是不可能的。您可以将数组用作主列表,并且只能存在指向该对象的指针,并始终通过索引到其他位置的数组来引用该对象。
如果你必须按照你所说的做,我能想到的最直接的解决方案是让对象本身带有一个标志(标记为是否发布)作为所有引用之间的通信方式。只要将引用设置为null,就将标志设置为true。在取消引用任何引用之前检查标志。我不知道MovieClip中是否有内置属性用于类似目的,但AS3是动态的,您可以自己添加属性。在其他语言中,您可以在其周围创建一个包装器来携带标志。但是请注意:这会使一个基本的编程概念弯曲(参考指向一个对象不会相互交谈),如果你不小心,你可能会在这里和那里得到惊喜。
答案 2 :(得分:0)
您必须获取集合中项目的索引并将其设置为null或使用splice如果您只想将其从集合中删除,这是我能想到的两个选项:
a_arr.splice(a_arr.indexOf(a_Mc),1);
//or
a_arr[a_arr.indexOf(a_Mc)] = null;