0

我正在使用 AS3 和 FlashDevelop,但我似乎无法说服我的 FlashPlayer/AVM 对它进行 GC。

我尝试了非常标准的选项:

myboolean = null;
delete(myboolean);

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

这是考虑到布尔值是在这样的方法中定义的:

var myBoolean:Boolean = false;

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

因此,如果有人知道如何对布尔值进行 GC,请告诉我。

4

3 回答 3

2

基本上就像 Jonatan Hedborg 所说的,你不能直接控制垃圾收集的内容。

我的猜测是您来自 ac/c++ 背景或类似的背景,您负责更严格和直接地维护内存,AS3 和 Java 并非完全如此;尽管内存管理仍然非常重要,但它更多的是在对象级别处理。虽然 Boolean 是从 Object 扩展而来的,但这里关于原始类型:

Null 数据类型 Null 数据类型仅包含一个值 null 。这是 String 数据类型和定义复杂数据类型的所有类(包括 Object 类)的默认值。其他基本数据类型(例如 Boolean、Number、int 和 uint)都不包含值 null 。如果您尝试将 null 分配给 Boolean、Number、int 或 uint 类型的变量,Flash Player 和 Adob​​e AIR 会将 null 值转换为适当的默认值。您不能将此数据类型用作类型注释。

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 运行得太少或太多,而是创建永远不会删除的引用(添加侦听器而不是从应该收集的对象中删除,或者只是在集合中引用它们等等。需要更长的时间)。上面的文章再次更深入地解释了这一点。

于 2012-06-23T20:46:16.740 回答
0

你在哪里使用布尔值?确保原语被 GC 处理的唯一方法是确保收集它所使用的类。

于 2012-06-23T19:36:15.587 回答
0

你的推理有两个错误:

  • 'delete' 只能应用于动态对象,不能应用于类成员或局部变量;在这些情况下,只需将成员/变量设置为 null,
  • 值类型(布尔值、数字、字符串)不需要进行 GC;在某些情况下,Flash 会创建临时的“装箱对象”,这些对象会被自动收集,因此您不必担心这些。
于 2012-06-24T09:37:27.153 回答