Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 什么机制允许AS3XML数据在类中被引用,但在原始对象被销毁时仍然存在_Actionscript 3 - Fatal编程技术网

Actionscript 3 什么机制允许AS3XML数据在类中被引用,但在原始对象被销毁时仍然存在

Actionscript 3 什么机制允许AS3XML数据在类中被引用,但在原始对象被销毁时仍然存在,actionscript-3,Actionscript 3,我有一个名为_refXMLManager的类实例,它包含一些XML数据,我可以通过_refXMLManager.xmlData引用这些数据 我有第二个类,名为XMLREFTEST: package { public class XMLREFTEST { private var _data:XML; function XMLREFTEST(data:XML) { _data=data } public function get data():XML { retu

我有一个名为_refXMLManager的类实例,它包含一些XML数据,我可以通过_refXMLManager.xmlData引用这些数据

我有第二个类,名为XMLREFTEST:

package {
 public class XMLREFTEST {
 private var _data:XML;

  function XMLREFTEST(data:XML) {
    _data=data
  }

  public function get data():XML {
    return _data;
  }

 }
}
我可以通过更改_refXMLManager中节点的值并查看它在_xmlRefTest中的更新来验证_xmlRefTest中的数据是否确实是引用

trace("_refXMLManager data: " + _refXMLManager.xmlData.test);
// _refXMLManager data: HELLO WORLD

_xmlRefTest = new XMLREFTEST(_refXMLManager.xmlData);
trace("_xmlRefTest data: " + _xmlRefTest.data.test);
// _xmlRefTest.data: HELLO WORLD

_refXMLManager.xmlData.test="Hi"
trace("_refXMLManager data: " + _refXMLManager.xmlData.test);
// _refXMLManager data: Hi

trace("_xmlRefTest data: " + _xmlRefTest.data.test);
// _xmlRefTest data: Hi
然后我杀死“主”对象。(kill函数将_refXMLManager中的原始URLLoader和xmlData设置为null)


所以我的问题是:ActionScript中发生了什么,允许处理原始XML对象,但允许对它的引用保持不变?我想知道引用是否必须等待垃圾收集,但事实似乎并非如此。

您误解了AS3中的引用和变量。如果对象仍有至少一个引用,则无法终止该对象

因此_xmlRefTest.data仍然有对xml的引用,因为它确实从一开始就防止了对象被破坏

你确实假设了一些事实上从未发生过的事情:

  • 原始物体从未被摧毁
  • 您从未真正删除过原始xml
  • xml不能是GC,因为它从一开始就不适合它,因为它至少还有一个引用

BotMaster谢谢您的回答,我刚刚才知道。你的解释很有道理。有趣的是,变量可以测试null,即使它引用的值仍然存在。我希望一个空变量将该状态传递给引用它的所有变量,因为它们毕竟是引用。
_refXMLManager.kill();
trace("_refXMLManager.xmlData==null: " + (_refXMLManager.xmlData==null));    
// _refXMLManager.xmlData==null: true

trace("_xmlRefTest data: " + _xmlRefTest.data.test);
// _xmlreftest data: Hi