Flash 如何删除/gc Actionscript 3中的对象?

Flash 如何删除/gc Actionscript 3中的对象?,flash,actionscript-3,oop,class,Flash,Actionscript 3,Oop,Class,我想从类实例内部删除/强制垃圾收集。显然,this=null和delete this不起作用。这是我能做到的,还是我找错了人?我基本上是在找某种类型的析构函数 我有一个试图加载XML文件的类实例,如果找不到该文件,我希望销毁该实例,最好是从实例内部销毁。然后,重点是根据子实例是否为null,在父类中执行一些操作 我曾想过向父级抛出一个事件并从中删除子级,但我更愿意这样做,除非没有其他方法。AS3不提供任何析构函数。您最好将所有引用设置为null,并祈求好运——GC会注意到它并释放内存 Syste

我想从类实例内部删除/强制垃圾收集。显然,
this=null
delete this
不起作用。这是我能做到的,还是我找错了人?我基本上是在找某种类型的析构函数

我有一个试图加载XML文件的类实例,如果找不到该文件,我希望销毁该实例,最好是从实例内部销毁。然后,重点是根据子实例是否为null,在父类中执行一些操作


我曾想过向父级抛出一个事件并从中删除子级,但我更愿意这样做,除非没有其他方法。

AS3不提供任何析构函数。您最好将所有引用设置为
null
,并祈求好运——GC会注意到它并释放内存

System.gc()
// Forces the garbage collection process. 
参考:


您应该先了解一下垃圾收集,Grant.S写了一篇关于这方面的好文章:

重点不是将类本身设置为null,而是删除其所有引用,包括侦听器。一旦它完全变成孤儿,垃圾可能会在某一点把它捡起来

基本示例:

// References a newly created sprite
var reference:Sprite = new Sprite();

// Removes the reference, the Sprite is now orphaned and will probably be garbage collected within some seconds.
reference = null;
一个好的实践是在所有类上系统地创建一个“destruct”方法,该方法删除所有内部引用、处置位图、删除事件侦听器等,此后您只需担心断开外部类的链接


如果您使用FLEX Builder,您可以使用探查器来可视化Flash Player在内部处理所有这一切的方式。

您不应该尝试从对象本身移除对象-这是一种不好的做法,在AS3中,您不能确定这样做

只有在没有对该对象的引用时,才可以删除该对象(即垃圾回收)。由于引用总是按值传递,而对象通常不知道存在对它的引用,所以不能从对象本身删除对象。您可以做的唯一有用的事情是创建一个方法,该方法将清理实例使用的所有资源。这种方法将用作析构函数,但您必须手动调用它。不要忘记,事件侦听器也会阻止垃圾收集,除非您删除它们

将属性设置为
null
delete
之间也存在差异。有效地
delete
将从动态类的实例中删除属性。然而,将属性值设置为
null
不会删除该属性,而是会删除存储在其中的任何引用。因此,这两个操作都将销毁存储在某些属性中的引用。请注意,您不能
删除对象,只能删除属性

在FlashPlayer9和更早版本中,有一些黑客可以用来启动垃圾收集。但是最近,
System.gc()
调用变得可用,这也起到了同样的作用。请注意,您不能真正依赖GC将被调用这一事实。这取决于flash播放器

回到你的问题:抛出事件并通知家长出了问题实际上是个好主意。你应该坚持下去。此外,如果父级通过这种方式知道这类事件,而不是在发现某些属性神奇地为空时,则更好


附言:在flash player中阅读Grant Skinner实际上是个好主意。

这里有一种不受支持的方法来强制从中收集垃圾


如果使用addChild()方法将对象添加到DisplayContainer,则可以使用parent.removeChild(此选项)从对象内的容器中删除该对象。如果在此之后没有对对象的引用,垃圾收集器将拾取该对象


唯一的问题是当对象中有事件侦听器时,您可以手动删除这些侦听器,也可以让垃圾收集器通过在所有侦听器上设置weakReference=true来为您执行此操作。

Ok,但如何从对象内部将类实例设置为null?@evilpenguin,除非您使用的是单例,你不能从类本身内部做这件事。您可以从实例化该类的类中执行此操作。@evilpenguin:正如所建议的,您必须从外部执行此操作。quote:仅适用于Flash Player调试器版本和AIR应用程序,因此它对我几乎没有用处。“请注意,您不能删除对象,只能删除属性。”-我不确定这是什么意思。如果我的属性是一个对象怎么办?@Luke:我的意思是,对象A的属性可能包含对某个对象B的引用,但是
delete A.prop
只会删除该属性以及引用。也就是说,A将不再具有属性
prop
,但可能会在某个地方留下对对象B的引用。因此B不会得到GC'ed。
System.GC()
仅适用于flash player的调试版本。您应该修改一下,说明它不应该用于调试以外的任何用途。@Jonathan Dumaine:谢谢您的评论。然而,我想很明显,“您不能真正依赖”部分暗示System.gc()在生产代码中没有什么用处。此外,如果程序员不尝试查阅文档,那么产生的问题完全是他的错+我对你的评论进行了评论,强调了这个问题。
try {
   new LocalConnection().connect('foo');
   new LocalConnection().connect('foo');
} catch (e:*) {}
// the GC will perform a full mark/sweep on the second call.