AS3,FlashDevelop:布尔人。你如何GC他们?

时间:2012-06-23 19:32:27

标签: actionscript-3 garbage-collection boolean flashdevelop

我正在使用AS3和FlashDevelop,我似乎无法说服我的FlashPlayer / AVM到GC。

我尝试了相当标准的选项:

myboolean = null;
delete(myboolean);

但是对于null,它表示“col:14警告:null用于预期布尔值的位置。” 并删除我得到“col:11错误:尝试删除固定属性allDone。只能删除动态定义的属性。”

这是考虑布尔在一个方法中定义如下:

var myBoolean:Boolean = false;

我很感激,因为它在方法中,当它运行时它当然应该被垃圾收集,但我喜欢确定,为什么我不能GC布尔当我为int做同样的, Array和Point在同一个类的另一个方法中?布尔也不是一个对象吗?

所以,如果有人知道怎么GC布尔值,请告诉我。

3 个答案:

答案 0 :(得分:2)

基本上像Jonatan Hedborg这样说你不直接控制什么是垃圾收集。

我的猜测是你来自c / c ++背景或类似的东西,你负责更严格和直接地维护内存,这与AS3和Java不完全相同;尽管内存管理仍然非常重要,但它在对象级别处理得更多。虽然布尔值从Object读取延伸到原始类型:

  

空数据类型Null数据类型只包含一个值null。这个   是String数据类型和所有类的默认值   定义复杂的数据类型,包括Object类。没有任何一个   其他原始数据类型,例如Boolean,Number,int和uint,   包含值null。 Flash Player和Adobe AIR将转换   如果尝试分配,则将null值设置为适当的默认值   null为Boolean,Number,int或uint类型的变量。你不能   将此数据类型用作类型注释。

http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f88.html#WS5b3ccc516d4fbf351e63e3d118a9b90204-7f82

在这两种情况下,您都有一些机制,例如对所有活动对象的图形中的对象进行分离引用,这意味着它们将在垃圾收集器的下一次计划运行时被垃圾收集(可以强制它但是它不是真的推荐,在这种情况下,JVM或AVM的配置将根据它运行/执行的系统来处理它。

将对象置零将允许它被垃圾收集,但您不应该真正关注单个基元属性。这里有一篇很好的文章解释了AS3中垃圾收集的一些细节(我会留下一个摘要,但整个页面都相当不错,主要观点我认为垃圾收集不一定是100%直接但有一些努力可以管理): http://tomgabob.blogspot.com/2009/11/as3-memory-management.html

基本上它的工作方式是FlashPlayer或运行的任何虚拟机你的(字节)代码都有一个已创建的所有对象的图形,并且有一个当前的引用。

它还具有基于环境(配置等)可以使用的内存限制,因此GC具有算法设置以确定何时应该尝试垃圾收集。您应该主要关注对不再需要的对象的引用进行归零,如果您的应用程序不是很复杂,或者您的硬件对RAM没有太大的限制,那么这实际上并不算太大。

所以问题不应该是让GC运行得太少或太多,而是创建永远不会删除的引用(添加Listeners而不是从应该收集的对象中删除,或者只是在集合中引用它们等等)他们不再需要了)。上面的文章再次对此进行了更深入的解释。

答案 1 :(得分:0)

你在哪里使用布尔值?确保基元是GC的唯一方法是确保收集它所使用的类。

答案 2 :(得分:0)

您的推理中有2个错误:

  • 'delete'只能应用于动态对象,而不能应用于类成员或局部变量;在这些情况下,只需将member / variable设置为null,
  • 值类型(布尔值,数字,字符串)不需要GC'd;在某些情况下,Flash会创建临时的“拳击对象”,这些对象将被自动收集,因此您不必担心这些。