Apache flex 如何获取实例';s";“内存位置”;在动作脚本中?
FlexBuilder的调试器将向您显示任何范围内实例的“内存位置”(或者,我只能假设,大致类似的内容): 但是我希望在代码中获得这些信息(有点像Python的Apache flex 如何获取实例';s";“内存位置”;在动作脚本中?,apache-flex,actionscript-3,actionscript,flex3,Apache Flex,Actionscript 3,Actionscript,Flex3,FlexBuilder的调试器将向您显示任何范围内实例的“内存位置”(或者,我只能假设,大致类似的内容): 但是我希望在代码中获得这些信息(有点像Python的id函数),这样我就可以很容易地跟踪对象是如何在系统中移动的。例如,我可能有: trace("Returning", id(foo)); 然后在其他地方我可以使用: trace("Using", id(foo)); 确保两段代码都处理同一个实例 现在,我知道许多AS类实现了IUID接口。。。但也有一些类没有(例如,普通的旧数组和对象
id
函数),这样我就可以很容易地跟踪对象是如何在系统中移动的。例如,我可能有:
trace("Returning", id(foo));
然后在其他地方我可以使用:
trace("Using", id(foo));
确保两段代码都处理同一个实例
现在,我知道许多AS类实现了IUID
接口。。。但也有一些类没有(例如,普通的旧数组和对象),所以这并不能解决我的问题
我意识到我也可以在
ObjectProxy
中包装对象,但这也不太理想。从我的头顶上看,实现这一点的唯一方法是使用Dictionary对象(您可能希望启用弱键以避免任何副作用)然后在创建对象时将其作为递增ID计数器的键使用。然后,您可以简单地查看字典中是否存在两个作为键的对象,如果存在,则比较其中存储的值。AFAIK无法获取调试器在运行时向您显示的值
黑暗中的总镜头,但我认为您可以使用===比较来确定两个对象是否是同一个对象(与比较对象值的==相反)。但我可能完全错了。实际上,我建议你不要用太多这个。。。它很贵。Adobe需要创建一个本机函数才能将其返回给我们 但是,现在。。。试试这个: 您需要使用显式强制才能获得它! 因为当您进行显式强制时,会出现如下错误: TypeError: Error #1034: Type Coercion failed: cannot convert Main@1c49d31 to flash.utils.ByteArray. 瞧! 您将获得哈希而不会导致错误! 在这之后,我做了一个更加充实的方式。。。试试这个:
var memoryHash:String;
尝试
{
FakeClass(anyObjectToKnowItAllocationHash);
}
捕获(e:错误)
{
memoryHash=String(e)。将(/.*([@\$].*)替换为。*$/gi,$1');
}
内部最终类FakeClass{}
对此稍作解释:
fakeClass需要确保这会生成一个错误。
正则表达式是捕获最后一个@。。。看来是这样。因为对象和函数在此错误上生成不同的消息。$用于捕获静态对象、类和函数,因为它们的内存散列中没有“@”,内存中没有不同的区域
这个小代码对我来说太好了!现在,我可以完成一些伟大的引擎,我正在使其与内存管理,弱引用和基于内存的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));
非常感谢你的回答
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的Scout调试器,它是一个功能强大得多的调试器
啊,是的——这主意不错。谢谢“==”确实会比较两个对象的身份…但这对我没有多大帮助(除非我保留对每个对象的引用,然后…)@David:如果你没有对每个对象的引用,那么你如何访问你的对象呢?如果您没有对对象的引用,它们将被垃圾收集。我想这还不清楚——在某个地方会有对每个实例的引用,但不会有“我所有实例的一个中央存储库”。您可能想看看这个:,这正是branden建议的…)啊,看起来不错-谢谢!哈哈,这真是个疯狂的黑客!我只是想说,在移动设备上,这里的首要答案是错误的。基本上,返回的内存地址不会是唯一的;据我所知,这是因为与Flash Player相比,在空气中的内存处理效率更高。Lakshmi Narayana发布的解决方案适用于所有设备,并且速度更快、更可靠。对于regexp部分,
String(e)。替换(/.*(@\w+).*/,“$1”)
同样有效。另一个注意事项:这只适用于英语(regexp指定“to”),以便在您的错误可能以多种语言出现的情况下使用它:String(e).replace(/.*([@\$].*)\S+.$/gi,“$1”)
如果从类中删除函数,删除静态,并重命名文件getObjectMemoryHash.as,则可以直接使用它,就像getTimer()