Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/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
Apache flex 如何获取实例';s";“内存位置”;在动作脚本中?_Apache Flex_Actionscript 3_Actionscript_Flex3 - Fatal编程技术网

Apache flex 如何获取实例';s";“内存位置”;在动作脚本中?

Apache flex 如何获取实例';s";“内存位置”;在动作脚本中?,apache-flex,actionscript-3,actionscript,flex3,Apache Flex,Actionscript 3,Actionscript,Flex3,FlexBuilder的调试器将向您显示任何范围内实例的“内存位置”(或者,我只能假设,大致类似的内容): 但是我希望在代码中获得这些信息(有点像Python的id函数),这样我就可以很容易地跟踪对象是如何在系统中移动的。例如,我可能有: trace("Returning", id(foo)); 然后在其他地方我可以使用: trace("Using", id(foo)); 确保两段代码都处理同一个实例 现在,我知道许多AS类实现了IUID接口。。。但也有一些类没有(例如,普通的旧数组和对象

FlexBuilder的调试器将向您显示任何范围内实例的“内存位置”(或者,我只能假设,大致类似的内容):

但是我希望在代码中获得这些信息(有点像Python的
id
函数),这样我就可以很容易地跟踪对象是如何在系统中移动的。例如,我可能有:

trace("Returning", id(foo));
然后在其他地方我可以使用:

trace("Using", id(foo));
确保两段代码都处理同一个实例

现在,我知道许多AS类实现了
IUID
接口。。。但也有一些类没有(例如,普通的旧数组和对象),所以这并不能解决我的问题


我意识到我也可以在
ObjectProxy
中包装对象,但这也不太理想。

从我的头顶上看,实现这一点的唯一方法是使用Dictionary对象(您可能希望启用弱键以避免任何副作用)然后在创建对象时将其作为递增ID计数器的键使用。然后,您可以简单地查看字典中是否存在两个作为键的对象,如果存在,则比较其中存储的值。

AFAIK无法获取调试器在运行时向您显示的值


黑暗中的总镜头,但我认为您可以使用===比较来确定两个对象是否是同一个对象(与比较对象值的==相反)。但我可能完全错了。

实际上,我建议你不要用太多这个。。。它很贵。Adobe需要创建一个本机函数才能将其返回给我们

但是,现在。。。试试这个:

您需要使用显式强制才能获得它! 因为当您进行显式强制时,会出现如下错误:

TypeError: Error #1034: Type Coercion failed: cannot convert Main@1c49d31 to flash.utils.ByteArray. 瞧! 您将获得哈希而不会导致错误! 在这之后,我做了一个更加充实的方式。。。试试这个:

var memoryHash:String;
尝试
{
FakeClass(anyObjectToKnowItAllocationHash);
}
捕获(e:错误)
{
memoryHash=String(e)。将(/.*([@\$].*)替换为。*$/gi,$1');
}
内部最终类FakeClass{}
对此稍作解释: fakeClass需要确保这会生成一个错误。 正则表达式是捕获最后一个@。。。看来是这样。因为对象和函数在此错误上生成不同的消息。$用于捕获静态对象、类和函数,因为它们的内存散列中没有“@”,内存中没有不同的区域

这个小代码对我来说太好了!现在,我可以完成一些伟大的引擎,我正在使其与内存管理,弱引用和基于内存的ID一起工作

我希望这能帮助你


再见,祝你好运,我的朋友

Diney Bomfim的解决方案非常有效。我将其封装在名为
DebugUtils
的类中,并封装在名为
getObjectMemoryHash
的函数中

package
{
    public class DebugUtils
    {
        public static function getObjectMemoryHash(obj:*):String
        {
            var memoryHash:String;

            try
            {
                FakeClass(obj);
            }
            catch (e:Error)
            {
                memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1');
            }

            return memoryHash;
        }
    }
}

internal final class FakeClass { }
然后我可以在任何地方使用这个函数并跟踪它,就像这样:

trace('myObj', DebugUtils.getObjectMemoryHash(myObj));
非常感谢你的回答

private static var _uids:Dictionary = new Dictionary(true);
private static var _cter:uint = 1;

public static function getObjectMemoryHash(obj:*):uint {
   var ret:uint = _uids[obj];
   return (ret == 0) ? (_uids[obj] = _cter++) : ret;
}

这是一个很好的安装程序,但它需要唯一的标识号

看看Adobe的Scout调试器,它是一个功能强大得多的调试器


啊,是的——这主意不错。谢谢“==”确实会比较两个对象的身份…但这对我没有多大帮助(除非我保留对每个对象的引用,然后…)@David:如果你没有对每个对象的引用,那么你如何访问你的对象呢?如果您没有对对象的引用,它们将被垃圾收集。我想这还不清楚——在某个地方会有对每个实例的引用,但不会有“我所有实例的一个中央存储库”。您可能想看看这个:,这正是branden建议的…)啊,看起来不错-谢谢!哈哈,这真是个疯狂的黑客!我只是想说,在移动设备上,这里的首要答案是错误的。基本上,返回的内存地址不会是唯一的;据我所知,这是因为与Flash Player相比,在空气中的内存处理效率更高。Lakshmi Narayana发布的解决方案适用于所有设备,并且速度更快、更可靠。对于regexp部分,
String(e)。替换(/.*(@\w+).*/,“$1”)
同样有效。另一个注意事项:这只适用于英语(regexp指定“to”),以便在您的错误可能以多种语言出现的情况下使用它:
String(e).replace(/.*([@\$].*)\S+.$/gi,“$1”)
如果从类中删除函数,删除静态,并重命名文件getObjectMemoryHash.as,则可以直接使用它,就像
getTimer()