Flash CS4 отказывается отпустить
У меня есть проект Flash, и у него много исходных файлов. У меня довольно популярный класс, назовите его Дженин. Я недавно (и, возможно, бессердечно) перевез Дженин из одного пространства имен в другое. Я думал, что мы были готовы - я думал, что пришло время. Новая Дженина была лучше во всех отношениях - она потеряла часть кода, она развязала себя от нескольких рудиментарных классовых отношений, и она наконец-то вернулась домой в пространство имен, которое она всегда тайно знала в своем сердце - это то, что она действительно принадлежал. Она была в своем роде.
К сожалению, у 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 скомпилировать, он все равно с любовью вставляет ее в мой фильм, укореняя ее определение среди других живых классов, как маленький храм. Интересно, смогут ли они ее увидеть?
Флэш и я больше не разговариваю. Я пишу свой код, он компилирует его. В городе появилась новая девушка по имени Саммер, которая выглядит почти идентично Дженин, как будто кто-то скопировал ее исходный код оптом в новый класс, но Flash не проявил никакого интереса. В большинстве случаев он просто шутит и пишет плохие стихи в моих комментариях, когда думает, что я не смотрю.
Я надеюсь, что ни у кого не было подобного опыта, что это просто необычная, болезненная рябь в ужасающей темной лагуне, которая является базой кода Flash. У кого-нибудь есть идеи, как стереть кеш, который использует компилятор?
Ответы
Ответ 1
У 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
, чтобы удалить их.
Ответ 2
Попробуйте удалить ваши ASO файлы.
Файлы ASO кэшируются скомпилированными версиями ваших файлов классов. Хотя IDE намного лучше отпускает старые кеши при внесении изменений, иногда вам приходится вручную удалять их. Для удаления файлов ASO: Управление > Удалить файлы ASO.
Это также является причиной ошибки "Я-не-видя-меня-изменений-так-пусть-меня-добавить-трассировать-теперь-все-работает", которая была введена в CS3.
Ответ 3
Что делать, если вы скомпилируете его с помощью другой машины? Свежий установленный был бы прекрасен. Надеюсь, ваша машина не ревнует.
Ответ 4
Я нашел одно связанное поведение, которое может помочь (кажется, что ваша конкретная проблема работает глубже):
Flash проверяет, должен ли исходный файл перекомпилировать, просмотрев временные метки. Если его скомпилированная версия старше исходного файла, она будет перекомпилирована. Но он не проверяет, была ли скомпилированная версия сгенерирована из того же исходного файла или нет.
В частности, если у вас есть файлы actionscript в разделе управления версиями, и вы вернете изменение, у восстановленного файла обычно будет более старая метка времени, и Flash проигнорирует ее.
Ответ 5
Кроме того, чтобы использовать новый класс с именами, вы также можете выполнять
var jenine:com.newnamespace.subspace.Jenine = com.newnamespace.subspace.Jenine()
Ответ 6
У вас есть несколько swf файлов? Если ваш класс импортирован в один из swf, другой swf также будет использовать ту же версию класса. Один старый импорт с * в одном swf сделает это. Перекомпилируйте все и посмотрите, работает ли это.
Ответ 7
Используйте аналог grep
, чтобы найти строки oldnamespace
и Jenine
внутри файлов во всей папке проекта. Затем вы узнаете, что делать дальше.