Проблема в том, что компилятор исключит любой класс, на который нет прямой ссылки где-то в вашем коде. Это оптимизация, которую компилятор применяет по проекту .
Обычный способ обойти это точно так, как вы показали в своем «примере 3». Но важно отметить, что две линии не обязательно должны быть вместе в одном месте. Пока
var newMc:GraphicAsset;
находится где-то в вашем SWF, на который ссылается основной путь выполнения, тогда определение класса для GraphicAsset
будет включено в окончательный SWF. Тогда вы можете позвонить ...
var GraphicsAssetClass:Class = getDefinitionByName("GraphicAsset") as Class;
откуда-то еще, и все будет работать так, как вы ожидаете.
Даже возможно (и довольно часто) найти две строки в sefrate SWFs . В этом случае один SWF будет загружать другой SWF во время выполнения. Как правило, загрузчик swf будет тот, который использует getDefinitionByName("SomeClass)
, а загруженный swf будет тот, который определяет class SomeClass
и использует var a:SomeClass;
, чтобы гарантировать, что класс встроен в SWF.
По этой причине вы часто находите класс с именем что-то вроде «MyLibraryManifest», определенный в «SWF библиотеки», а затем на который ссылаются из основного мувиклипа этого SWF. Класс «manifest» тогда будет выглядеть так:
class MyLibraryManifest {
private var a:GraphicAsset;
private var b:SomeClass;
private var c:SomeOtherClass;
//... and so on...
}
[edit] Вы можете использовать опции -includes
или -include-libraries
для компилятора mxmlc
, чтобы заставить компоновщик включать один или несколько отдельных классов (или весь swc), без применения "оптимизации сокращения" Я описал выше.
см. Сайт Adobe для объяснения параметров командной строки mxmlc.
Параметры также могут быть , указанные в файле конфигурации , что позволяет вам контролировать, как flex и / или Flash IDE будут вызывать компилятор за кулисами.
удачи!