FlexBuilder的调试器将向您显示任何范围内实例的“内存位置”(或者,我只能假设,大致类似):
但是我想在代码中获取这些信息(有点像Python的id
函数),所以我可以很容易地跟踪对象如何在系统中移动。例如,我可能有:
trace("Returning", id(foo));
然后我可以使用其他地方:
trace("Using", id(foo));
确保两个代码都处理相同的实例。
现在,我知道许多AS类实现了IUID
接口......但是也有一些类没有(例如普通的旧数组和对象),所以不会解决我的问题。
我意识到我也可以在ObjectProxy
中包装对象,但这也不太理想。
答案 0 :(得分:59)
真的,我建议你不要使用太多......这是非常昂贵的。 Adobe需要创建一个本机函数将其返回给我们。
但是,现在......试试这个:
你需要明确强制来获得它! 因为当你制作并明确强制时,你会得到一个像这样的错误:
TypeError: Error #1034: Type Coercion failed: cannot convert Main@1c49d31 to flash.utils.ByteArray.
请注意,在此错误中,您可以获得所需内容... @ 1c49d31。这个哈希就像内存分配中的ID。
我做了很多测试。当你调用“new”时,这个哈希就会改变(在C语言中相当于[[... alloc] init]),对于静态函数和静态属性,分配发生了一些不同......无论如何... < / p>
回到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。
我希望这可以帮到你。
再见,祝你好运,我的朋友!答案 1 :(得分:11)
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));
非常感谢你的回答!
答案 2 :(得分:6)
在我的脑海中,我能看到将其拉下来的唯一方法就是使用一个Dictionary对象(你可能想要启用弱键以避免任何副作用)然后只需将对象当作你创建它们并将它们用作递增ID计数器的键。然后你可以简单地查看两个对象是否作为字典中的键存在,如果是,则比较存储在那里的值。
答案 3 :(得分:5)
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;
}
这是一个很好的安装程序,但它需要唯一的识别号
答案 4 :(得分:2)
看看Adobe的Scout调试器 - 它是一个功能更强大的调试器
http://gaming.adobe.com/technologies/scout/
http://www.adobe.com/devnet/scout/articles/adobe-scout-getting-started.html
答案 5 :(得分:1)
AFAIK无法获得调试器在运行时显示的值。
在黑暗中完全拍摄但我认为您可以使用===比较来确定两个对象是否是同一个对象(与比较对象值的==相反)。但我可能完全错了。