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

前端之家收集整理的这篇文章主要介绍了flex – 如何在ActionScript中获取实例的“内存位置”?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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。

我希望这可以帮助你。

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

原文链接:https://www.f2er.com/flex/174476.html

猜你在找的Flex相关文章