当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在Actionscript3中删除/gc对象?》经验,为你挑选了2个好方法。

我想从内部删除/强制类实例上的垃圾收集.显然,this = nulldelete this没有工作.我能以任何方式做到这一点,还是我咆哮着错误的树?我基本上是在寻找某种类型的析构函数..

我有一个类实例尝试加载XML文件,如果找不到该文件,我想破坏该实例,最好是从内部本身.然后,重点是在父类中做一些事情,具体取决于子实例是否为null.

我曾想过把一个事件扔给父母并从那里删除孩子,但我更愿意这样做只有在没有别的办法的情况下.



1> dragonfly..:

你不应该试图从自身中删除对象 - 这是一种不好的做法,而在AS3中你无法做到这一点.

对象可以被删除(即收集垃圾)仅如果没有离开该对象的引用.由于引用总是通过值传递,并且对象通常不知道存在哪个引用,因此您无法从自身中删除对象.您可以做的唯一有用的事情是创建一个方法来清理实例使用的所有资源.这种方法将用作析构函数,但您必须手动调用它.不要忘记事件侦听器也会阻止垃圾回收,除非你删除它们.

delete"建立属性"和"设置属性" 之间也存在差异null.有效地delete将从动态类的实例中删除属性.设置属性值null不会删除属性,但会删除存储在那里的任何引用.因此,这两个操作都将破坏存储在某些属性中的引用.注意,你不能delete是一个对象,只能是一个属性.

某些黑客可用于启动闪存播放器9和旧版本的垃圾收集.然而,最近System.gc()呼叫可用,这也是一样的.请注意,您实际上不能真正依赖GC实际调用的事实.这取决于flash播放器.

回到你的问题:抛出事件并通知父母出现问题其实是个好主意.你应该坚持下去.而且,如果父母会以这种方式知道这样的事件,而不是何时会发现某些属性被神奇地取消,那就更好了.

PS:阅读格兰特斯金纳关于闪存播放器内存的文章实际上是一个好主意.


`System.gc()`仅适用于flash播放器的调试版本.你应该修改一下,除了调试之外不应该用它.
@Luke:我的意思是对象A的属性可能包含对某个对象B的引用,但是`delete A.prop`只会删除该属性以及引用.即A将不再拥有属性`prop`,但可能会引用对象B留在某处.所以B不会得到GC.

2> 小智..:

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

唯一的问题是当你在对象中有事件监听器时,你可以手动删除它,或者让垃圾收集器通过在所有监听器上设置weakReference = true来为你做.

推荐阅读
李桂平2402851397
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有