加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flex – 如何在ActionScript中获取实例的“内存位置”?

发布时间:2020-12-15 02:08:55 所属栏目:百科 来源:网络整理
导读:FlexBuilder的调试器将向您显示任何范围内实例的“内存位置”(或者,我只能假设大致类似的东西): 但我想在代码中获得这些信息(类似于Python的id函数),所以我可以很容易地跟踪对象如何通过系统。例如,我可能有: trace("Returning",id(foo)); 然后在其他地
FlexBuilder的调试器将向您显示任何范围内实例的“内存位置”(或者,我只能假设大致类似的东西):

但我想在代码中获得这些信息(类似于Python的id函数),所以我可以很容易地跟踪对象如何通过系统。例如,我可能有:

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

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

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

以确保代码的两个位都处理同一个实例。

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

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

解决方法

在现实中,我建议你不要使用太多…它是非常昂贵的。 Adobe需要创建一个本地函数来返回给我们。

但是,现在…尝试这:

你需要引起明确的强制才能得到它!
因为当你做和显式强制,你会得到一个错误,像这样:

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

注意,在这个错误,你得到你想要的… @ 1c49d31。这个哈希像内存分配中的ID。

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

回到Flash,问题是我们没有一个直接的方法来获取这个散列没有错误。

但这不是一个真实的大问题。所有你需要的是使用一些“try”和“catch”
喜欢这个:

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。

我希望这可以帮助你。

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读