当前位置:  开发笔记 > 编程语言 > 正文

如何在ActionScript中获取实例的"内存位置"?

如何解决《如何在ActionScript中获取实例的"内存位置"?》经验,为你挑选了4个好方法。

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

调试器内存位置

但是我想在代码中获取这些信息(有点像Python的id功能),所以我可以很容易地跟踪对象如何在系统中移动.例如,我可能有:

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

然后我可以使用的其他地方:

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

确保两个代码都处理相同的实例.

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

我意识到我也可以将对象包装成一个ObjectProxy,但这也不太理想.



1> 小智..:

真的,我建议你不要使用太多......这是非常昂贵的.Adobe需要创建一个本机函数来将其返回给我们.

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

你需要明确的强制来获得它!因为当你制作并明确强制时,你得到一个像这样的错误:

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

请注意,在此错误中,您可以得到您想要的... @ 1c49d31.此哈希就像内存分配中的ID.

我做了很多测试.当你调用一个"new"时,这个哈希就会改变(在C语言中相当于[[... alloc] init]),对于静态函数和静态属性,分配发生了一些不同......无论如何......

回到Flash,问题是我们没有直接的方法来获取没有错误的哈希.

但这不是一个很大的问题.你需要的只是使用一些"尝试"和"捕获"像这样:

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

瞧!您将获得哈希而不会导致错误!在此之后我做了一个更加改进的方式......试试这个:

var memoryHash:String;

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

internal final class FakeClass { }

稍微解释一下:fakeClass确定会产生错误.RegularExpression用于捕获出现的最后一个@ .... 因为对象和函数在此错误上生成不同的消息.而且$是为了捕获静态对象,类和函数,因为它们的内存哈希中没有"@",而内存中的区域也不同.

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

我希望这可以帮到你.

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



2> Ellis Elkins..:

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

非常感谢这个答案!


如果你从类中删除函数,删除静态,并重命名文件getObjectMemoryHash.as,那么你就可以直接使用它,就像`getTimer()`

3> Branden Hall..:

在我的脑海中,我可以看到将其拉下来的唯一方法是使用Dictionary对象(您可能希望启用弱键以避免任何副作用)然后只需在创建它们时获取对象将它们用作递增ID计数器的键.然后你可以简单地查看两个对象是否作为字典中的键存在,如果是,则比较存储在那里的值.



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

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

推荐阅读
雨天是最美
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有