2014-03-31 2 views
3

두 가지 메소드 그룹이 작동하는 클래스 세트의 차이점은 무엇입니까 (예 : ApplicationDomain의 클래스 정의 세트와 getDefinitionByName 클래스 정의 세트).flash.utils.getDefinitionByName 대 ApplicationDomain의 클래스 정의 메소드

  1. ApplicationDomain. getDefinition/hasDefinition/getQualifiedDefinitionNames (플래시 플레이어 11.3+ 만, 문서화되지 않은)
  2. getDefinitionByName

그것은 응용 프로그램 도메인 계층 구조가 있음을 분명하고 정의가 일부 응용 프로그램 도메인이 아닌 다른 사람에 표시 될 수있다. 예를 들어 ApplicationDomain.getDefinition은 지정된 앱 도메인에 정의되어 있지 않지만 액세스 할 수있는 정의를 반환합니까? (예 : 도메인이 하위 도메인이고 부모에서 정의 된 정의를 찾으려면?) ApplicationDomain에 대한 설명서에는 "부모가 아직 정의하지 않은 경우에만로드 된 클래스가 정의됩니다."라는 내용이 나와 있습니다. "(ApplicationDomains)는 같은 클래스에 대한 여러 정의가 존재할 수 있으며 자식이 부모 정의를 재사용 할 수 있도록합니다." 에서 ApplicationDomain.getDefinition이 네임 스페이스기능 클래스 정의에 추가 정의를 반환하는 반면

문서는 또한의 getDefinitionByName이 클래스 정의를 반환하는 것을 나타냅니다.

클래스 정의에만 관심이 있다고 가정하고 어떤 ApplicationDomains가 getDefinitionByName 검색을 수행합니까? (? 예를 들어 모든 도메인, 호출자에게 접근 현재/발신자 도메인 만, 또는 도메인)

이 초기 테스트는 혼란 : 위의 테스트에서

import flash.system.ApplicationDomain; 
var d:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); //child of current domain 
trace(ApplicationDomain.currentDomain.hasDefinition("flash.display.DisplayObject")); //true 
trace(ApplicationDomain.currentDomain.getQualifiedDefinitionNames().length); //1 (the main timeline class definition only: Untitled_fla::MainTimeline) 
trace(d.hasDefinition("flash.display.DisplayObject")); //false 

, 한편으로, getQualifiedDefinitionNames 보고서 현재 타임 라인 클래스 만 현재 앱 도메인에 정의되어 있지만 getDefinition은 DisplayObject에 대해 true를 반환하여 부모 (시스템) 도메인에 정의가 있음을 알리는 것을 나타내지 만 손자 도메인의 최종 추적은 false를 반환하여 모순됩니다.

ApplicationDomain.currentDomain.parentDomain은 null을 반환합니다. "시스템 도메인에 현재 도메인을 포함한 모든 응용 프로그램 도메인이 포함되어 있습니다."및 "시스템 도메인을 제외한 모든 응용 프로그램 도메인에 다음 문법 설명과 직접적으로 부합됩니다. 연결된 상위 도메인. 메인 응용 프로그램의 응용 프로그램 도메인의 상위 도메인은 시스템 도메인입니다. "

모순은 여기 currentDomain는 정의가 있지만, currentDomain해야하는 부모, 자식 도메인을 만들고 액세스 할 때, 갑자기이 정의에 포함되지 않는 것을보고 어디에 매우 명백하다 :

trace(ApplicationDomain.currentDomain.hasDefinition("flash.display.DisplayObject")); //true 
trace((new ApplicationDomain(ApplicationDomain.currentDomain)).parentDomain.hasDefinition("flash.display.DisplayObject")); //false! why? 

답변

2

이 페이지는 꽤 포괄적입니다 : http://www.senocular.com/flash/tutorials/contentdomains/?page=2 나는 몇 가지 신비를 해결할 수 있었지만 위에 설명한 기본 질문 (특히 getDefinitionByName의 범위와 관련)은 여전히 ​​유효합니다. 나는 단지 내가 해결할 수 있었던 것에 대한 답을 게시하고 싶었다.

부모가 시스템 도메인 인 경우 parentDomain을 가져 오면 null이 반환됩니다. 따라서 parentDomain이 시스템 도메인이지만 parentDomain 속성은 null을 반환합니다. 그것이 바로 그 방법입니다.안타깝게도 getQualifiedDefinitionNames를 통한 클래스 열거와 같이 시스템 도메인에 액세스 할 수 없게됩니다.

내 초기 테스트에서 새 ApplicationDomain을 구성하면 실제로 SWF가 해당 도메인 아래로드 될 때까지 죽은 개체가 만들어지는 것으로 보입니다. 예를 들어 현재 도메인의 자식 도메인을 만들고 hasDefinition을 호출하면 false가 반환되지만, 동일한 인스턴스를 로더 컨텍스트에 할당하고 Loader.load에 전달하면로드가 완료되면 hasDefinition을 호출 할 수 있습니다 원래 false를 반환 한 인스턴스이며 대신 true를 반환합니다. 따라서 부모와 함께 ApplicationDomain을 구성 할 수는 있지만 실제로 사용되기 전까지는 실제로 작동하지 않습니다.

var d:ApplicationDomain = new ApplicationDomain(ApplicationDomain.currentDomain); //child of current domain 
trace(d.hasDefinition("flash.display.DisplayObject")); //false for now... 
var l:Loader = new Loader(); 
l.load(new URLRequest("any.swf"), new LoaderContext(false, d)); 
l.contentLoaderInfo.addEventListener(Event.COMPLETE, completed, false, 0, true); 
function completed(e:Event):void 
{ 
    trace(d.hasDefinition("flash.display.DisplayObject"); //...and now it's true. 
} 

은 그래서에서 ApplicationDomain.getDefinition 등 도메인 부모, 조부모에 보고서 클래스를 않는 것처럼 보인다, 그러나 그것은 새로운 ApplicationDomain에 인스턴스가에로드 뭔가를 통해 활성화 된 후 이렇게 할 만합니다.

또한 ApplicationDomain 인스턴스는 동일한 응용 프로그램 도메인을 참조 할 수 있지만 직접 비교할 수는 없습니다. 예 : (ApplicationDomain.currentDomain == ApplicationDomain.currentDomain) false입니다.