我怎样才能得到一个实例的“存储位置”在ActionScript?(How can I get an

2019-07-03 22:04发布

弹性生成的调试器会告诉你的“记忆区”(或者,我只能假设,事情大致类似)在任何范围的实例的:

但是,我想获得的代码信息(有点像Python的id功能),所以我可以很容易地追踪对象如何移动通过了该系统。 例如,我可能有:

trace("Returning", id(foo));

然后,别的地方我可以使用:

trace("Using", id(foo));

为了确保代码的两个位正在处理相同的实例。

现在,我知道很多AS类实现IUID接口......但也有一堆哪些没有(普通的旧数组和对象,例如)类,这样,才不会解决我的问题。

我意识到,我还可以换对象在ObjectProxy ,但是这将是不太理想的为好。

Answer 1:

在真的我劝你不要用这个太多...这是非常昂贵。 土坯需要创建一个本地函数来此给我们。

不过,现在...试试这个:

您将需要引起强制转换,就搞定了! 因为当你和强制转换,你会得到这样的错误:

TypeError: Error #1034: 
Type Coercion failed: cannot convert Main@1c49d31 to flash.utils.ByteArray.

注意,在这个错误你得到你想要的东西...在@ 1c49d31。 该散列是像在存储器分配的ID。

我做了很多的测试。 当你调用一个“新”这个哈希只是改变(在C语言中相当于[... ALLOC] INIT])和静态函数和静态属性,分配发生了一点不同......反正...

备份到闪存,问题是我们没有直接的办法让这个哈希没有一个错误。

但是,这不是一个真的大问题。 所有你需要的是使用一些“尝试”和“catch”像这样:

try
{
    ByteArray(anyObjectToKnowItAllocationHash);
}
catch (e:Error)
{
    trace(e);
}

瞧! 您将获得哈希不导致错误! 这之后,我做了一个更refinated方式...试试这个:

var memoryHash:String;

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

internal final class FakeClass { }

这个有点讲解:fakeClass是要知道这会产生一个错误。 在正则表达式是捕获的最后@ ......出现。 因为对象和函数生成此错误不同的消息。 而且$是捕捉静态对象,类和函数,bacause他们没有在内存中的哈希,并在内存不同区域的“@”。

这个小小的代码工作这么好我! 现在我可以完成我正在做基于内存的内存管理,弱引用和ID的工作一些伟大的引擎。

我希望这可以帮助你。

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



Answer 2:

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));

非常感谢这个答案!



Answer 3:

把我的头,我可以看到拉这个功能是使用Dictionary对象(你可能会希望启用弱键,以避免任何副作用),并为您创建它们,然后只取对象的唯一途径的顶部和把它们作为一个关键的递增ID计数器。 然后,你可以简单地看看,如果两个对象存在在词典中的钥匙,如果是比较存储在那里的值。



Answer 4:

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;
}

这是工作的罚款安装程序,但它需要的唯一标识号



Answer 5:

看看Adobe的侦察员调试器 - 这是一个更加强大的调试器

http://gaming.adobe.com/technologies/scout/

http://www.adobe.com/devnet/scout/articles/adobe-scout-getting-started.html



Answer 6:

据我所知是没有办法去调试器显示在运行时的值。

总瞎猜,但我认为你可以使用===比较,以确定是否两个对象是同一个对象(与==的值进行比较的对象)。 但我可能是完全错误上。



文章来源: How can I get an instance's “memory location” in ActionScript?