弹性生成的调试器会告诉你的“记忆区”(或者,我只能假设,事情大致类似)在任何范围的实例的:
但是,我想获得的代码信息(有点像Python的id
功能),所以我可以很容易地追踪对象如何移动通过了该系统。 例如,我可能有:
trace("Returning", id(foo));
然后,别的地方我可以使用:
trace("Using", id(foo));
为了确保代码的两个位正在处理相同的实例。
现在,我知道很多AS类实现IUID
接口......但也有一堆哪些没有(普通的旧数组和对象,例如)类,这样,才不会解决我的问题。
我意识到,我还可以换对象在ObjectProxy
,但是这将是不太理想的为好。
在真的我劝你不要用这个太多...这是非常昂贵。 土坯需要创建一个本地函数来此给我们。
不过,现在...试试这个:
您将需要引起强制转换,就搞定了! 因为当你和强制转换,你会得到这样的错误:
TypeError: Error #1034:
Type Coercion failed: cannot convert Main@1c49d31 to flash.utils.ByteArray.
注意,在这个错误你得到你想要的东西...在@ 1c49d31。 该散列是像在存储器分配的ID。
我做了很多的测试。 当你调用一个“新”这个哈希只是改变(在C语言中相当于[... ALLOC] INIT])和静态函数和静态属性,分配发生了一点不同......反正...
备份到闪存,问题是我们没有直接的办法让这个哈希没有一个错误。
但是,这不是一个真的大问题。 所有你需要的是使用一些“尝试”和“catch”像这样:
try
{
ByteArray(anyObjectToKnowItAllocationHash);
}
catch (e:Error)
{
trace(e);
}
瞧! 您将获得哈希不导致错误! 这之后,我做了一个更refinated方式...试试这个:
var memoryHash:String;
try
{
FakeClass(anyObjectToKnowItAllocationHash);
}
catch (e:Error)
{
memoryHash = String(e).replace(/.*([@|\$].*?) to .*$/gi, '$1');
}
internal final class FakeClass { }
这个有点讲解:fakeClass是要知道这会产生一个错误。 在正则表达式是捕获的最后@ ......出现。 因为对象和函数生成此错误不同的消息。 而且$是捕捉静态对象,类和函数,bacause他们没有在内存中的哈希,并在内存不同区域的“@”。
这个小小的代码工作这么好我! 现在我可以完成我正在做基于内存的内存管理,弱引用和ID的工作一些伟大的引擎。
我希望这可以帮助你。
再见,祝你好运,我的朋友!
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));
非常感谢这个答案!
把我的头,我可以看到拉这个功能是使用Dictionary对象(你可能会希望启用弱键,以避免任何副作用),并为您创建它们,然后只取对象的唯一途径的顶部和把它们作为一个关键的递增ID计数器。 然后,你可以简单地看看,如果两个对象存在在词典中的钥匙,如果是比较存储在那里的值。
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;
}
这是工作的罚款安装程序,但它需要的唯一标识号
看看Adobe的侦察员调试器 - 这是一个更加强大的调试器
http://gaming.adobe.com/technologies/scout/
http://www.adobe.com/devnet/scout/articles/adobe-scout-getting-started.html
据我所知是没有办法去调试器显示在运行时的值。
总瞎猜,但我认为你可以使用===比较,以确定是否两个对象是同一个对象(与==的值进行比较的对象)。 但我可能是完全错误上。