我有一个Flash项目,它有很多源文件。我有一个使用量相当大的班级,叫Jenine。我最近(也许是无情地)将Jenine从一个命名空间迁移到另一个命名空间。我以为我们已经准备好了——我以为是时候了。新的珍妮在各方面都更好——她失去了一些代码膨胀,她与一些残存的阶级关系脱钩,她终于回到了自己心中一直秘密知道的名字空间,那是她真正属于的名字空间。她属于自己的同类。

不幸的是,Flash没有这些。也许它形成了一种依恋。也许它不想让珍妮脱钩。无论哪种方式,它都紧紧抓住了记忆中的老版、完美版珍妮。它拒绝继续。它忽略了她的(函数)调用。它试图忘记她的新的公共界面。相反,它构建的Jenine的每个实例始终是旧版本的副本,一直到其类路径:

var jenineInstance:Jenine = new Jenine();
trace( getQualifiedClassName(jenineInstance));
// Should print: com.newnamespace.subspace::Jenine
// Prints: com.oldnamespace.subspace::Jenine
// Ah, young love!

我们战斗了。我对我所说或做的一些事情并不感到骄傲。最后,在极度愤怒的情况下,我彻底删除了所有提到珍妮的内容。她被彻底、彻底地从系统中删除了。我的光标落在“清空垃圾”菜单选项上,就像一个冰冷的棺材盖。

我认为Flash永远不会恢复。直到今天,它仍然萦绕在珍妮的记忆中。她的旧的、不完美的定义仍然像被遗弃的鬼魂一样漂浮在我的项目中。每当我强迫Flash编辑时,它仍然会可爱地将她插入我的电影中,将她的定义嵌套在其他活生生的阶层中,就像一座小神殿。我想知道他们是否能看到她。

闪电侠和我真的不再说话了。我写代码,它编译它。镇上有一个叫Summer的新女孩,她看起来和Jenine几乎一模一样,好像有人刚刚把她的源代码批量复制到一个新的类中,但Flash没有表现出任何兴趣。大多数时候,当它认为我没在看的时候,它只是在我的评论里闷闷不乐地写些糟糕的诗。

我希望没有其他人有过类似的经历,这只是Flash代码库中可怕的黑暗泻湖中的一个奇怪、痛苦的涟漪。有人知道如何擦除编译器正在使用的缓存吗?


当前回答

你有几个swf文件吗?如果您的类是在一个swf中导入的,其他swf也将使用该类的相同版本。一个swf中有*的旧导入就可以了。重新编译所有内容,看看是否有效。

其他回答

Flash仍然有ASO文件,这是为您的类编译的字节码。在Windows上,您可以在此处看到ASO文件:

C:\Documents and Settings\username\Local Settings\Application Data\Adobe\Flash CS4\en\Configuration\Classes\aso

在Mac上,目录结构类似于/Users/username/Library/Application Support/


您可以手动删除这些文件,也可以在Flash中选择控制->删除ASO文件以删除它们。

使用grep模拟来查找整个项目文件夹中文件中的字符串oldnamespace和Jenine。然后你就知道下一步该做什么了。

我发现了一种可能有帮助的相关行为(听起来你的具体问题更为严重):

Flash通过查看时间戳来检查源文件是否需要重新编译。如果其编译版本早于源文件,则将重新编译。但它不会检查编译版本是否从同一源文件生成。

具体来说,如果您的actionscript文件处于版本控制之下,并且您恢复了更改,则恢复的文件通常具有较旧的时间戳,Flash将忽略它。

尝试删除ASO文件。

ASO文件是类文件的缓存编译版本。尽管IDE在进行更改时更善于释放旧缓存,但有时您必须手动删除它们。要删除ASO文件,请执行以下操作:Control>delete ASO files。

这也是CS3中引入的“I-am-not-seeeing-my-changes-so-let-me-add-atrace-now-everything-works”错误的原因。

你有几个swf文件吗?如果您的类是在一个swf中导入的,其他swf也将使用该类的相同版本。一个swf中有*的旧导入就可以了。重新编译所有内容,看看是否有效。