【问题标题】:Flash CS4 不肯放手
【发布时间】:2011-01-12 17:32:48
【问题描述】:

我有一个 Flash 项目,它有很多源文件。我有一个相当常用的类,叫它 Jenine。我最近(也许是无情地)将 Jenine 从一个命名空间迁移到另一个命名空间。我以为我们准备好了——我以为是时候了。新的珍妮在各方面都变得更好了——她减少了一些代码膨胀,她把自己从一些退化的阶级关系中解脱出来,她终于回到了她一直在心里暗自知道的名字空间是她真正的名字曾经属于。她是同类中的一员。

不幸的是,Flash 没有这些。或许,它已经形成了一种依恋。也许它不想要 Jenine 被解耦。无论哪种方式,它都牢牢记住了旧的、完美的珍妮版本。它拒绝继续前进。它忽略了她的(函数)调用。它试图忘记她新的公共界面。相反,它构建的每个 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 编译时,它仍然会亲切地将她插入我的电影中,将她的定义依偎在其他生活类中,就像一座小神殿。我不知道他们能不能看到她。

Flash,我真的不再说话了。我写我的代码,它编译它。镇上来了一个叫 Summer 的新女孩,她长得和 Jenine 几乎一模一样,好像有人刚刚将她的源代码批发复制到一个新班级中,但 Flash 并没有表现出任何兴趣。大多数时候,当它认为我没在看的时候,它只是闷闷不乐,在我的 cmets 上写下糟糕的诗。

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

【问题讨论】:

    标签: flash caching flash-cs4


    【解决方案1】:

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

    【讨论】:

    • 我自己对你为什么被否决的猜测是你给出了一个相当明显的答案,并强烈暗示它将解决问题。你的回答不一定是坏的,但你的措辞可能会被解释为不合理的过度自信或傲慢,这有时会惹恼人们。
    • 嗯。可能你是对的。另一方面,当问题没有为像我这样的明显问题提供答案时,这令人沮丧。类似于“我在所有文件中搜索了字符串 Jenine,但找不到匹配项”。我很感兴趣。我想解开这个谜。但作者让我悬而未决。
    • 正如我所说,您的回答不一定是坏的;可能只是你的措辞惹恼了某人。老实说,这是我的第一反应。我通常会尝试以“希望这会有所帮助”的方式说事情,因为事情的真正原因经常不是你想的那样。同样,我同意您的回答 是人们应该尝试的,因此值得考虑作为提交的答案,但措辞有时对人们的影响超出其应有的程度。
    【解决方案2】:

    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 来删除它们。

    【讨论】:

    • 从下面复制:这个和另一个非常相似的答案正是我想要的,但不幸的是似乎没有解决问题。我将把它归结为 Adob​​e bug fun tiem。不过,我会将其标记为已解决。
    • PS:我一遍又一遍地点击菜单项。为了最终删除包含珍妮最后回声的文件,我深入研究了文件结构。他们不在那里。当我问起他们时,Flash只是喃喃自语一些语无伦次的东西,然后凝视着太空。我想我可以开始听到疯狂敲击鼠标按钮的声音。珍妮在笑。
    • @Ender,如果您在新机器上重新编译代码,您是否会遇到同样的问题。就像在新计算机上重新签出代码一样?这应该告诉您是否是代码问题或 your 文件系统*上的问题。
    【解决方案3】:

    此外,要使用新的命名空间类,您也可以这样做

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 是的,我敢打赌 Jenine 会被编译到您代码的其他部分中,无论是您使用的 swf 还是 swc。
      【解决方案5】:

      如果你用另一台机器编译它会怎样?一个新安装的会很可爱。我希望你的机器不要嫉妒。

      【讨论】:

        【解决方案6】:

        尝试删除您的 ASO 文件。

        ASO 文件是类文件的缓存编译版本。尽管 IDE 在进行更改时释放旧缓存的能力要好得多,但有时您必须手动删除它们。删除 ASO 文件:Control>Delete ASO Files。

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

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

          • 没错,我与来自南非和伦敦的开发人员一起参与了多个项目。当我们来回传递 flash 文件时,我们必须将其保存在本地,因为编译会导致基于文件时间戳的疯狂错误。从本质上讲,尝试编译将来保存的闪存是问题所在。我们通过更改操作系统上的日期来解决这个问题。尝试检查您的时间戳。
          猜你喜欢
          • 1970-01-01
          • 2011-05-11
          • 1970-01-01
          • 2011-03-02
          • 2016-10-04
          • 2010-11-06
          • 1970-01-01
          • 1970-01-01
          • 2012-04-11
          相关资源
          最近更新 更多