3

这两个方法组在它们使用的类集(即ApplicationDomain 的类定义集与getDefinitionByName 使用的类定义集)方面有什么区别?

  1. 应用程序域。getDefinition / hasDefinition / getQualifiedDefinitionNames(仅限 Flash Player 11.3+,未记录)
  2. 按名称获取定义

很明显,存在应用程序域层次结构,并且定义可能在某些应用程序域中可见,而在其他应用程序域中不可见。例如,ApplicationDomain.getDefinition 是否会返回未在给定应用程序域中定义但可从中访问的定义?(例如,如果域是子域并且我们正在查找父域中定义的定义?) ApplicationDomain 的文档只是说“加载的类仅在其父域尚未定义时才定义。” 但它也说“(ApplicationDomains)允许存在同一个类的多个定义并允许子级重用父级定义。”

该文档还指出 getDefinitionByName 返回定义,而 ApplicationDomain.getDefinition 将返回除类定义之外的命名空间函数定义。

假设我只对类定义感兴趣,getDefinitionByName 搜索什么 ApplicationDomains?(例如所有域,仅当前/调用者域,或调用者可访问的任何域?)

这个初始测试令人困惑:

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?
4

1 回答 1

2

这个页面非常全面:http ://www.senocular.com/flash/tutorials/contentdomains/?page= 2 我已经设法解决了几个谜团,但是上面概述的基本问题(特别是关于 getDefinitionByName 的范围)仍然站立。我只是想为我能够解决的问题发布一个答案。

如果父域是系统域,则检索 parentDomain 将返回 null。因此,虽然 parentDomain 是系统域,但 parentDomain属性无论如何都会返回 null。就是那样子。不幸的是,这使得系统域无法访问,例如,通过 getQualifiedDefinitionNames 进行类枚举。

关于我的初始测试,似乎构造一个新的 ApplicationDomain 会创建一个死对象,直到在该域下实际加载了 SWF。例如,创建当前域的子域并在其上调用 hasDefinition 将返回 false,但如果您将相同的实例分配给加载器上下文并将其传递给 Loader.load,一旦加载完成,您可以调用 hasDefinition on最初返回 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) 为假。

于 2014-03-31T18:44:12.663 回答