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。
我希望这可以帮助你。
再见,祝你好运,我的朋友!