Пользовательский класс AS3 не обновляется

У меня была похожая проблема, но средства, которые я решил последним, здесь не работают.

У меня есть собственный класс, состоящий из 12 отдельных модулей .as. Они объявлены в классе документа следующим образом:

import trailcrest.v1.s3.averta;
import trailcrest.v1.s3.chronos;
import trailcrest.v1.s3.eripio;
import trailcrest.v1.s3.fabrilla;
import trailcrest.v1.s3.gradua;
import trailcrest.v1.s3.lingua;
import trailcrest.v1.s3.navigare;
import trailcrest.v1.s3.pedem;
import trailcrest.v1.s3.praeferre;
import trailcrest.v1.s3.scriba;
import trailcrest.v1.s3.securos;
import trailcrest.v1.s3.sonus;

public static var Averta:averta = new averta();
public static var Chronos:chronos = new chronos();
public static var Eripio:eripio = new eripio();
public static var Fabrilla:fabrilla = new fabrilla();
public static var Gradua:gradua = new gradua();
public static var Lingua:lingua = new lingua();
public static var Navigare:navigare = new navigare();
public static var Pedem:pedem = new pedem();
public static var Praeferre:praeferre = new praeferre();
public static var Scriba:scriba = new scriba();
public static var Securos:securos = new securos();
public static var Sonus:sonus = new sonus();

Это новая версия кода. Я могу успешно обращаться ко всем этим классам, общедоступным переменным и функциям внутри класса документа «osr.as». Я также могу ВИДЕТЬ один модуль из другого (например, Sonus может видеть Scriba, используя «osr.Scriba».

Проблема заключается в том, что, несмотря на то, что раньше различные модули могли без проблем получать доступ ко всем общедоступным функциям и переменным друг друга, после того, как я добавил несколько новых модулей и переменных и удалил некоторые старые, Flash Professional по-прежнему буквально ИСПОЛЬЗУЯ старую версию. Внутри любого модуля подсказки по коду показывают все старые общедоступные функции и переменные и ничего нового.

Я предполагаю, что это как-то связано с каким-то временным файлом, к которому я не могу получить доступ. Мне очень нужна эта работа на этой неделе!

Мой .fla — «Tester.fla», а класс документа — «osr.as». Они оба в одном каталоге. Также в том же каталоге находится структура папок «/trailcrest/v1/s3/», содержащая все модули Trailcrest.

Помощь??

РЕДАКТИРОВАТЬ: Всякий раз, когда я пытаюсь сослаться на один класс Trailcrest из другого класса Trailcrest (например, osr.Sonus.foo), я получаю...

TypeError: Ошибка № 1009: невозможно получить доступ к свойству или методу нулевой ссылки на объект.

Я подтвердил без тени сомнения все ссылки.


person CodeMouse92    schedule 12.11.2012    source источник
comment
Вы проверили, действительно ли это вызывает ошибки во время компиляции, я предполагаю, что это просто проблема с редактором кода в CS5.5, основываясь на вашем описании, это не похоже на то, что на самом деле что-то не так, я бы отменил изменения, а затем внес всего одно изменение, скажем, имя общедоступного метода в одном из файлов, посмотрите, обновляется ли подсказка кода автоматически, если нет, посмотрите, можете ли вы все еще просто внести изменение вручную, где это необходимо, и запустить его. Если это так, это просто редактор не обновляется, возможно, перезапуск flash после изменений поможет (или, если возможно, используйте другой редактор).   -  person shaunhusain    schedule 13.11.2012
comment
Все это я редактировал в Notepad++. Подсказки кода проверяются, когда я загружаю osr.as в Flash Professional, и Flash Professional показывает изменения в каждом из них, когда я их открываю. Проблема возникает только тогда, когда один модуль (например, Sonus) пытается получить доступ к другому (например, Gradua) с помощью средств ссылки, которые работают уже почти год, т.е. osr.Gradua.{Function}   -  person CodeMouse92    schedule 14.11.2012


Ответы (2)


Это старая проблема, которая в конечном итоге сводится к ошибке проверки. Это происходит, когда вы встраиваете «Класс А» в одно или несколько приложений, модулей, swf-файлов и т. д. В конечном итоге каждый выходной swf-файл, использующий «Класс А», должен быть перекомпилирован при изменении «Класса А». В противном случае вы столкнетесь с ситуацией, когда один модуль имеет более новую реализацию, а другие — нет. Эта проблема усугубляется тем фактом, что домен приложения определяется как «первый в выигрыше», когда он сталкивается с классом с тем же именем/пакетом, что означает, что если сначала ссылаются на старый, более новый, загруженный позже, игнорируется.

Более постоянное решение — использовать повышение класса до RSL, что в конечном итоге позволяет RSL управлять фактической ссылкой «Класс A», в которой он также реализует интерфейс «IClassAImpl», который используют все модули. Это позволяет компилятору связать ссылку с известной ему сигнатурой без фактического внедрения самого класса.

person Mike Petty    schedule 12.11.2012
comment
Звучит правильно, Майк. Итак, какие шаги я предприму, чтобы решить эту проблему, потому что многое из этого для меня греческое... - person CodeMouse92; 13.11.2012
comment
Если у вас нехватка времени, когда вы обновляете код до класса, убедитесь, что все перекомпилировано (особенно, если оно используется совместно модулями). - person Mike Petty; 13.11.2012
comment
Хорошо, как мне убедиться, что все будет перекомпилировано? - person CodeMouse92; 13.11.2012
comment
Я думал, вы используете модули как отдельные SWF? Если это так, каждый FLA должен быть переиздан. Похоже, вы просто используете то, что называется классом (градуа, лингва и т. д.) — вы уверены, что у вас есть путь к библиотеке, указывающий на правильное физическое местоположение? Если какой-либо из этих классов связан с элементом библиотеки (базовым классом или классом) - должна быть проверка/найти/редактирование (не помню, как это называется) - если он не может его найти, то он определенно не иметь правильный путь к библиотеке. - person Mike Petty; 13.11.2012
comment
У меня есть только один .swf. И я не совсем уверен, что вы имеете в виду о путях к библиотекам. У меня сейчас даже нет кода или чего-то еще в .swf. Модули .as просто должны взаимодействовать друг с другом. Я проверил пути в коде моего вопроса, если вы это имеете в виду. - person CodeMouse92; 13.11.2012

Ну наконец-то я понял. Вот вкратце о том, что происходило:

# 1: Flash, по-видимому, загружал старую версию модулей Trailcrest. Чтобы исправить это, я сделал резервную копию всего, а затем удалил все старые экземпляры Trailcrest со всего моего компьютера. Потом поставил обратно только новые модули. Это устранило проблему с подсказками по коду, показывающими старые модули и переменные.

# 2: Я сталкивался с ошибкой № 1009 всякий раз, когда один класс Trailcrest пытался получить доступ к любому компоненту другого класса Trailcrest, даже если все ссылки были правильными.

Причина заключалась в том, что я вызывал функции для различных модулей непосредственно из класса документа osr.as вне функции. Это, конечно, выполняется при запуске программы.

Однако весь код внутри одного класса Trailcrest, вызывающий другой класс Trailcrest (т.е. osr.Sonus.foo), не сможет получить доступ к "foo", потому что osr.as по той или иной причине не завершил инициализацию классов до запуска кода, вызывающего их. Это произошло, несмотря на то, что код проблемы был значительно ниже кода, который инициализировал классы (см. мой вопрос).

Чтобы исправить это, мне просто пришлось обернуть код проблемы в общедоступную статическую функцию в классе документа, а затем вызвать ее из временной шкалы. Это гарантировало, что все классы будут инициализированы до того, как они попытаются ссылаться друг на друга.

Излишне говорить, что сейчас все работает как хорошо смазанный механизм. Как странно.

Я приветствовал бы любое объяснение относительно того, ПОЧЕМУ это устранило проблему.

person CodeMouse92    schedule 17.11.2012