Flash CS4拒绝释放

2797

我有一个Flash项目,其中包含许多源文件。我有一个相当常用的类,叫做Jenine。最近,我(也许有点无情地)将Jenine从一个命名空间移动到了另一个命名空间。我认为我们已经准备好了——我认为是时候了。新的Jenine在各个方面都更好了——它丢掉了一些代码膨胀,摆脱了一些残留的类关系,并最终回到了它一直暗自知道的命名空间。它终于和自己的同类人在一起了。

不幸的是,Flash并不接受这样的改变。也许它已经建立了某种联系。也许它并不想让Jenine脱离关联。无论如何,它仍旧记得Jenine的旧版本,而且恳求你不要离开。它拒绝前进,忽略新版本的函数调用和公共接口。相反,构建每个Jenine实例的都是旧版本的副本,包括其类路径:

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

我们打了架。我说过和做过的事情有些让我感到不骄傲。最后,在一阵愤怒之中,我完全删除了所有关于Jenine的引用。她被系统完全抹消了。我的光标停在“清空回收站”菜单选项上,就像冷棺材的盖子一样。

我认为Flash从未恢复过来。直到今天,它仍然紧抓着对Jenine的记忆。她旧的、不完美的定义仍然像被遗弃的幽灵一样漂浮在我的项目中。每当我强制Flash编译时,它仍然会将她爱怜地插入我的电影中,把她的定义放在其他存活的类中间,像一个小神龛。我想知道他们能不能看到她。

现在Flash和我已经不怎么交流了。我写我的代码,它编译我的代码。镇上有个叫Summer的新女孩,几乎和Jenine一模一样,好像有人刚刚把她的源代码全部复制到一个新的类里,但Flash没有表现出任何兴趣。大多数时候,它只是闷闷不乐地在我的注释中写糟糕的诗歌,当它觉得我没在看它时。

我希望没有其他人有过类似的经历,这只是Flash代码库中可怕黑暗池塘中的一个痛苦波纹。有人知道如何清除编译器正在使用的缓存吗?

7个回答

710

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 中选择 Control->Delete ASO files 来删除它们。


34
这篇和其他非常相似的回答完全符合我的期望,但不幸的是似乎并没有解决问题。我会把这个归咎于Adobe的问题。尽管如此,我会将其标记为已解决。 - Ender
296
PS:我一遍又一遍地点击菜单项。我深入文件结构,试图最终清除包含Jenine最后回声的文件,但它们不在那里。当我询问它们时,Flash只是咕哝着说些令人费解的话,直勾勾地盯着空间。在我的鼠标按钮疯狂敲打声中,我似乎可以开始听到某些声音。Jenine在笑。 - Ender
23
@Ender,如果您在新的计算机上重新编译代码,例如将代码从版本控制系统中检出到新的计算机上,您是否遇到相同的问题?这能告诉您是代码存在问题还是您的文件系统中残留了其他东西。请注意不要改变原文的意思。 - Jesse Webb

198

尝试删除您的ASO文件。

ASO文件是您的类文件的缓存编译版本。虽然IDE在做出更改时更好地释放旧缓存,但有时您需要手动删除它们。要删除ASO文件:控制>Delete ASO Files。

这也是CS3中引入的“我没有看到我的更改,所以让我现在添加一个跟踪,现在一切都正常”的错误的原因。


163

如果使用另外一台机器编译呢?最好使用全新安装的机器。我希望你的机器不会嫉妒。


126

我发现了一个相关的行为可能会有所帮助(但你的具体问题似乎更深入):

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

具体而言,如果您的actionscript文件受版本控制,并且还原了更改,则还原的文件通常会具有较旧的时间戳,而Flash将忽略它。


12
没错,我和来自南非和伦敦的开发人员一起合作多个项目。当我们交换Flash文件时,我们必须将其保存在本地,因为编译会导致基于文件时间戳的错误。实际上,尝试编译已保存在未来的Flash是问题所在。我们通过更改操作系统的日期解决了这个问题。请尝试检查您的时间戳。 - Dominic Tancredi

103

此外,要使用您的新命名空间类,您还可以执行以下操作:

var jenine:com.newnamespace.subspace.Jenine = com.newnamespace.subspace.Jenine()

96

你是否有多个swf文件?如果你的类被导入到其中一个swf中,则其他swf也将使用该类的相同版本。在一个swf文件中使用*进行旧版导入即可。重新编译一切并查看是否正常工作。


10
我猜测Jenine被编译进了你代码的其他部分,比如说一个SWF或SWC文件。 - Arpit

11

使用类似于 grep 的工具,在整个项目文件夹中查找字符串 oldnamespaceJenine。然后,您就会知道下一步该怎么做。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接