<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_阴天·爱 yintian2's Blog</title><subtitle type="text">我的.NET世界，asp.net ajax，Javascript，DIV+CSS，Atlas，web2.0，Flex, ActionScript3,Flash3D, 网页设计，网站策划，网站推广。</subtitle><id>http://feed.cnblogs.com/blog/u/23247/rss</id><updated>2011-04-27T16:45:41Z</updated><author><name>阴天&amp;amp;#183;爱</name><uri>http://www.cnblogs.com/yintian2/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yintian2/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/23247/rss"/><entry><id>http://www.cnblogs.com/yintian2/archive/2011/04/28/2031279.html</id><title type="text">Compile your AS3 projects with Ant + Flex SDK (all Open Source)</title><summary type="text">本文将讲述:怎样安装Ant应用Ant编译你的AS3项目.与此安装工作将允许你对你的代码编辑工作独立。然后你可以用任意编辑器打开项目并编译,而不用Flash IDE 或者 Flex.———————————————————————————————————安装要用的资源:———————————————————————————————————1 – 下载要用的资源:*Ant.zip*Flex SDK*tools.jar ( zip )解压 Ant.zip 和 Flex SDK 到相应的目录:例如c:\antc:\flex_sdk_4.0.0解压 tools.zip 到Java jre的lib目录例如我</summary><published>2011-04-27T16:46:00Z</published><updated>2011-04-27T16:46:00Z</updated><author><name>阴天&amp;amp;#183;爱</name><uri>http://www.cnblogs.com/yintian2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yintian2/archive/2011/04/28/2031279.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yintian2/archive/2011/04/28/2031279.html"/><content type="html">&lt;p&gt;本文将讲述:&lt;br /&gt;怎样安装Ant应用Ant编译你的AS3项目.&lt;br /&gt;与此安装工作将允许你对你的代码编辑工作独立。&lt;br /&gt;然后你可以用任意编辑器打开项目并编译,而不用Flash IDE 或者 Flex.&lt;br /&gt;&lt;span id="more-844"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;br /&gt;安装要用的资源:&lt;br /&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1 &amp;ndash; 下载要用的资源:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;*&amp;nbsp;&lt;a href="http://www.flashersteam.com/images/stories/elimak/09-05/ant_resources/ant.zip"&gt;Ant.zip&lt;/a&gt;&lt;br /&gt;*&amp;nbsp;&lt;a href="http://opensource.adobe.com/wiki/display/flexsdk/Downloads"&gt;Flex SDK&lt;/a&gt;&lt;br /&gt;*&amp;nbsp;&lt;a href="http://www.flashersteam.com/images/stories/elimak/09-05/ant_resources/tools.zip"&gt;tools.jar ( zip )&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;解压 Ant.zip 和 Flex SDK 到相应的目录:&lt;br /&gt;例如&lt;br /&gt;c:\ant&lt;br /&gt;c:\flex_sdk_4.0.0&lt;/p&gt;&#xD;
&lt;p&gt;解压 tools.zip 到Java jre的lib目录&lt;br /&gt;例如我的是: C:\Program Files\Java\jre6\bin&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2 -添加 Ant 的路径 到系统变量:&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;必须先添加Ant的环境变量才能使Ant正常工作.&lt;br /&gt;*打开系统属性&lt;br /&gt;* 选择 高级-&amp;gt;环境变量.&lt;br /&gt;&lt;img  title="acces_environmentpath" src="http://www.lite3.cn/wp-content/uploads/2010/08/acces_environmentpath.png" alt="环境变量" width="531" height="497" /&gt;&lt;br /&gt;在新窗口中找到Path 属性并点击编辑&lt;br /&gt;&lt;img  title="acces_environmentpath2" src="http://www.lite3.cn/wp-content/uploads/2010/08/acces_environmentpath2.png" alt="设置环境变量 path" width="384" height="423" /&gt;&lt;br /&gt;添加 "c:\ant;" (没有引号)&lt;br /&gt;&lt;img  title="acces_environmentpath3" src="http://www.lite3.cn/wp-content/uploads/2010/08/acces_environmentpath3.png" alt="设置环境变量 path" width="347" height="140" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;br /&gt;测试 ANT 编译的项目:&lt;br /&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;&#xD;
&lt;p&gt;你可以现在这个小项目&amp;nbsp;&lt;a href="http://www.lite3.cn/wp-content/uploads/2010/08/compile_with_ant.zip"&gt;compile_with_ant.zip&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;为了编译你的AS3 类,必须先配置 build.properties 和 the build.xml文件.&lt;br /&gt;设置项目properties适当的soure 和 output.&lt;br /&gt;你可以选择在独立版flash player或者浏览器中打开编译后的swf文件.&lt;br /&gt;确保设置适当的flexsdk目录.&lt;/p&gt;&#xD;
&lt;p&gt;打开命令提示符(cmd)窗口,进入到你的项目目录,输入ant 并回车,项目将被编译.&lt;br /&gt;&lt;img  title="prompt" src="http://www.lite3.cn/wp-content/uploads/2010/08/prompt.png" alt="命令提示符窗口cmd" width="668" height="343" /&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;br /&gt;最后:&lt;br /&gt;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&amp;mdash;&lt;/p&gt;&#xD;
&lt;p&gt;这个配置可能有点麻烦,但这个只需要配置一次,然后你只需要添加其他的类库就OK了&lt;/p&gt;&#xD;
&lt;p&gt;在FD(Flash Develop)里调用命令提示符窗口(cmd)是个不错的方法,FD可以避免你在命令提示符窗口(cmd)进入到项目目录.&lt;br /&gt;当你用FD打开你的项目,点击command prompt图标(工具栏-&amp;gt;command)将用当前项目目录打开命令提示符窗口(cmd).&lt;br /&gt;&lt;img  title="prompt_infd" src="http://www.lite3.cn/wp-content/uploads/2010/08/prompt_infd.png" alt="FD 命令提示符窗口(cmd)" width="593" height="224" /&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yintian2/aggbug/2031279.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yintian2/archive/2011/04/28/2031279.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yintian2/archive/2011/04/28/2031276.html</id><title type="text">有史以来关于Flash Player的最详细说明</title><summary type="text">本站原创文章，转载请注明：转载自zrong&amp;#39;s Blog，原文有史以来关于Flash Player的最详细说明本站转载文章会标明[转]，转载请注明原始作者文章地址。2010-12-09更新：加入卸载工具一、Flash Player的版本1.独立版和插件版Flash Player分为插件版和独立版，插件版安装后，让浏览器可以播放swf文件。独立版安装后，则可以直接在Windows中双击swf文件打开一个窗口来播放，不依赖浏览器。2.调试版和普通版Flash Player还有调试版（Debug版）和普通版，通过Adobe更新程序更新的均为普通版。调试版在swf发生运行时错误的时候会弹出对话</summary><published>2011-04-27T16:43:00Z</published><updated>2011-04-27T16:43:00Z</updated><author><name>阴天&amp;amp;#183;爱</name><uri>http://www.cnblogs.com/yintian2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yintian2/archive/2011/04/28/2031276.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yintian2/archive/2011/04/28/2031276.html"/><content type="html">&lt;div&gt;&#xD;
&lt;p&gt;&lt;strong&gt;本站原创文章，转载请注明：&lt;/strong&gt;&amp;nbsp;转载自&lt;a href="http://zengrong.net/"&gt;zrong's Blog&lt;/a&gt;，原文&amp;nbsp;&lt;a href="http://zengrong.net/post/1188.htm"&gt;有史以来关于Flash Player的最详细说明&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;本站转载文章会标明&lt;strong&gt;[转]&lt;/strong&gt;，转载请注明原始作者文章地址。&lt;/p&gt;&#xD;
&lt;/div&gt;&#xD;
&lt;hr /&gt;&#xD;
&lt;br /&gt;&lt;span&gt;2010-12-09更新：加入卸载工具&lt;/span&gt;&#xD;
&#xD;
&lt;hr /&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;一、Flash Player的版本&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;1.独立版和插件版&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;Flash Player分为插件版和独立版，插件版安装后，让浏览器可以播放swf文件。独立版安装后，则可以直接在Windows中双击swf文件打开一个窗口来播放，不依赖浏览器。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;2.调试版和普通版&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;Flash Player还有调试版（Debug版）和普通版，通过Adobe更新程序更新的均为普通版。调试版在swf发生运行时错误的时候会弹出对话框，而普通版不会。因此，游戏测试人员应该安装调试版。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;3.版本号&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&amp;nbsp;&lt;/strong&gt;Flash Player的版本号对程序的支持也有影响，如果没有特别的需求，应该使用最新的版本。目前最新版本为10.1。对AS3的提供支持的最低版本为9.0。&lt;br /&gt;如果一个使用了Flash Player 10.1提供的新功能的swf文件在Flash Player 9.0版本的Flash Player下播放，可能会播放不正常或者报错。&lt;br /&gt;如果一个在Flash 6下制作的swf在Flash Player 10.1下播放，也可能出现问题（恩，出问题后请记下错误号，然后用这个号码去买中国体育彩票）。&lt;span id="more-1188"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;4.下载最新的独立版和调试版&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;访问&amp;nbsp;&lt;a href="http://www.adobe.com/support/flashplayer/downloads.html" target="_blank"&gt;http://www.adobe.com/support/flashplayer/downloads.html&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;span&gt;ActiveX control content debugger (for IE)&amp;nbsp;&lt;/span&gt;为针对IE的调试插件版&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;Plugin content debugger (for Netscape-compatible browsers)&lt;/span&gt;&amp;nbsp;为针对其他浏览器（firefox、chrome、opera）的调试插件版&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;Projector content debugger&lt;/span&gt;为独立调试版&lt;/li&gt;&#xD;
&lt;li&gt;&lt;span&gt;Projector&lt;/span&gt;为独立普通版&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;如果需要下载普通版，则访问&amp;nbsp;&lt;a href="http://get.adobe.com/flashplayer" target="_blank"&gt;http://get.adobe.com/flashplayer&lt;/a&gt;，这个地址会根据你的浏览器自动下载对应的普通插件版。需要独立版请访问上面的地址。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;5.如果我下了一堆版本，但忘记哪个是XX版，哪个是无码版，怎么办？&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;文件名中带有_sa_字样的为独立版播放器，否则为插件版。&lt;/li&gt;&#xD;
&lt;li&gt;文件名中带有_debug字样的为调试版，否则为非调试版。&lt;/li&gt;&#xD;
&lt;li&gt;文件名中带有_ax_字样的是针对IE浏览器的版本。&lt;/li&gt;&#xD;
&lt;li&gt;文件名中带有_plugin字样的针对其他浏览器版本。&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;二、关于独立Flash Player播放器&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;如果要播放swf文件，一定不要使用什么暴风影音，QQ影音、垃圾影音等软件，那些全都是浮云&amp;hellip;&amp;hellip;&lt;/p&gt;&#xD;
&lt;p&gt;正确的做法应该是：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;复制独立调试版Flash Player到你的C:\Program Files文件夹（其他文件夹也行，建议是路径为全英文），双击运行一次，即可与swf文件自动关联（Win7/Vista用户右击，选择&amp;ldquo;以管理员身份运行&amp;rdquo;）&lt;/li&gt;&#xD;
&lt;li&gt;没有2，如果你一定要找2，那么你很2&amp;hellip;&amp;hellip;&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;三、如何分辨我正在使用的Flash Player是不是调试版？&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;无论是独立版还是插件版，只需要在正在播放的swf内容上单击右键，如果右键菜单中有&amp;ldquo;调试器&amp;rdquo;字样，就说明你使用的是调试版的Flash Player。见图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://zengrong.net/wp-content/uploads/2010/12/flashplayer_debug.png" rel="wp-prettyPhoto[g1188]"&gt;&lt;img  title="flashplayer_debug" src="http://zengrong.net/wp-content/uploads/2010/12/flashplayer_debug.png" width="189" height="315" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;四、如何判断我正在使用的Flash Player的版本？&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;对于插件版，请访问&lt;a href="http://www.flashplayerversion.com/" target="_blank"&gt;http://www.flashplayerversion.com&lt;/a&gt;&amp;nbsp;网站，可以看到自己的使用的FlashPlayer版本号，还可以判断你的Flash Player是否为调试版（Debug版）&lt;/p&gt;&#xD;
&lt;p&gt;对于独立版，在播放器exe文件上单击右键查看属性，可以看到版本号以及是否为Debug版本，Debugger值为1代表是Debug版，为0代表普通版。见图：&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://zengrong.net/wp-content/uploads/2010/12/flashplayer_prop.png" rel="wp-prettyPhoto[g1188]"&gt;&lt;img  title="flashplayer_prop" src="http://zengrong.net/wp-content/uploads/2010/12/flashplayer_prop.png" width="409" height="466" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;五、我在chrome浏览器下安装了调试版的FlashPlayer插件，为什么通过&lt;a href="http://www.flashplayerversion.com/" target="_blank"&gt;flashplayerversion&lt;/a&gt;&amp;nbsp;网站检测，仍然是普通版？版本号也不对？&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;安装完后应该关闭所有的浏览器窗口并重启浏览器，或重启Windows，或直接按下机箱电源键5秒直至屏幕变黑，或直接拔下主机电源插头。&lt;/li&gt;&#xD;
&lt;li&gt;chrome自己维护一个最新版的Flash Player插件更新（没办法，Flash Player漏洞太多），需要禁用它自己维护的插件，方法如下：&lt;br /&gt;1) 在chrome地址栏中输入：&lt;span&gt;chrome://plugins/&lt;/span&gt;&lt;br /&gt;2) 展开右上角的&lt;span&gt;&amp;ldquo;详细信息&amp;rdquo;&lt;/span&gt;&lt;br /&gt;3) 找到&amp;ldquo;&lt;span&gt;Flash (2 files) &amp;ndash; 版本： 10.1.85.3&amp;rdquo;&lt;/span&gt;类似字样，&lt;span&gt;停用&lt;/span&gt;位置位于&amp;ldquo;:\Documents and Settings\Administrator\Local Settings\&amp;hellip;&amp;hellip;&amp;rdquo;的一个，&lt;span&gt;启用&lt;/span&gt;位置位于&amp;ldquo;C:\WINDOWS\system32\Macromed\Flash\NPSWF32.dll&amp;rdquo;的那个。见图：&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;&lt;a href="http://zengrong.net/wp-content/uploads/2010/12/flashplayer_chrome.png" rel="wp-prettyPhoto[g1188]"&gt;&lt;img  title="flashplayer_chrome" src="http://zengrong.net/wp-content/uploads/2010/12/flashplayer_chrome.png" width="910" height="504" /&gt;&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;strong&gt;六、因为我是果粉，所以我觉得Flash Player超级稀烂，我要卸载它！&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;strong&gt;&lt;/strong&gt;&#xD;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;OK，虽然我讨厌Jobs，但我能理解你的心情，我相信Adobe也有同样的感受，所以他们提供了卸载工具：&lt;br /&gt;&lt;a href="http://www.adobe.com/go/14157" target="_blank"&gt;http://www.adobe.com/go/14157&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yintian2/aggbug/2031276.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yintian2/archive/2011/04/28/2031276.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yintian2/archive/2011/03/09/1977924.html</id><title type="text">深入理解Flash Player的应用程序域（Application Domains）(转载)</title><summary type="text">应用程序域Application Domains 应用程序域Application Domain Placement 应用程序域的位置Application Domain Inheritance 应用程序域的继承Child Domains: Definition Versioning 子域：定义的版本管理Separate Domains: Preventing Conflicts 域分离：避免冲突Same Domain: Runtime Shared Libraries 相同的域：运行时共享库Getting Definitions Dynamically 动态获取定义Same-definiti</summary><published>2011-03-09T02:00:00Z</published><updated>2011-03-09T02:00:00Z</updated><author><name>阴天&amp;amp;#183;爱</name><uri>http://www.cnblogs.com/yintian2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yintian2/archive/2011/03/09/1977924.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yintian2/archive/2011/03/09/1977924.html"/><content type="html">&lt;p&gt;&lt;strong&gt;应用程序域&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;ul&gt;&#xD;
&lt;li&gt;&lt;a href="http://kevincao.com/2010/11/application-domains/#ApplicationDomains"&gt;Application Domains 应用程序域&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://kevincao.com/2010/11/application-domains/#ApplicationDomainPlacement"&gt;Application Domain Placement 应用程序域的位置&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://kevincao.com/2010/11/application-domains/#ApplicationDomainInheritance"&gt;Application Domain Inheritance 应用程序域的继承&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://kevincao.com/2010/11/application-domains/#ChildDomainsDefinitionVersioning"&gt;Child Domains: Definition Versioning 子域：定义的版本管理&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://kevincao.com/2010/11/application-domains/#SeparateDomainsPreventingConflicts"&gt;Separate Domains: Preventing Conflicts 域分离：避免冲突&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://kevincao.com/2010/11/application-domains/#SameDomainRuntimeSharedLibraries"&gt;Same Domain: Runtime Shared Libraries 相同的域：运行时共享库&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://kevincao.com/2010/11/application-domains/#GettingDefinitionsDynamically"&gt;Getting Definitions Dynamically 动态获取定义&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://kevincao.com/2010/11/application-domains/#SamedefinitionCollisions"&gt;Same-definition Collisions 相同定义的冲突&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;li&gt;&lt;a href="http://kevincao.com/2010/11/application-domains/#Conclusion"&gt;Conclusion 总结&lt;/a&gt;&lt;/li&gt;&#xD;
&lt;/ul&gt;&#xD;
&lt;h3 id="ApplicationDomains"&gt;Application Domains 应用程序域&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;和安全域一样，不同安全沙箱下的SWF有着自己独立的类定义。这种在安全域下面进行划分和管理类定义（函数、接口和命名空间的定义也类似）的子域就是&lt;strong&gt;应用程序域&lt;/strong&gt;。应用程序域只存在于安全域内，并且只能属于唯一的一个安全域。但是安全域可以包含多个应用程序域。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://www.senocular.com/flash/tutorials/contentdomains/images/application_in_security.png" alt="Application Domains in Security Domains" width="348" height="233" /&gt;&lt;br /&gt;安全域内的应用程序域&lt;/p&gt;&#xD;
&lt;p&gt;虽然安全域沙箱用于保护数据安全，应用程序沙箱域用于划分定义。但是他们都用于解决定义的冲突和判断代码的继承关系。&lt;/p&gt;&#xD;
&lt;p&gt;安全域彼此之间是相互独立的，相比之下，应用程序域之间的关系则较为复杂。应用程序域通过类似于Flash中的显示列表那样的层级关系链接在一起。应用程序域可以包含任意的子域，而子域只能有一个父域。子域继承了来自父域中的定义，就像是显示列表中父对象的位置和缩放属性被子对象继承一样。&lt;/p&gt;&#xD;
&lt;p&gt;应用程序域的根节点是一个系统域，这个域包含了Flash Player API的原生定义（Array，XML，flash.display.Sprite等等）。系统域与安全域是一一对应的关系，当安全域初始化的时候这个唯一的系统域也被建立。&lt;span id="more-1463"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;当一个Flash Player的实例初始化的时候，SWF文件加到它对应的安全域内。同时也创建了一个包含了这个文件中所有编译过的ActionScript定义的应用程序域。这个应用程序域就成为安全域下的系统域的第一个子域。Flash Player API的原生定义就通过这种继承关系对所有子域开放。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://www.senocular.com/flash/tutorials/contentdomains/images/child_application_domain.png" alt="Child Application Domain" width="193" height="293" /&gt;&lt;br /&gt;在系统域下新建了一个SWF应用程序域&lt;/p&gt;&#xD;
&lt;p&gt;我们将在&lt;a href="http://kevincao.com/2010/11/application-domains/#ApplicationDomainInheritance"&gt;应用程序域的继承&lt;/a&gt;章节中进行更多关于继承的讨论。&lt;/p&gt;&#xD;
&lt;h3 id="ApplicationDomainPlacement"&gt;Application Domain Placement 应用程序域的位置&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;第一个实例化Flash Player的SWF文件所包含的定义总是被加载为系统域的直接子域。父SWF去加载子SWF的时候，可以控制子SWF内的定义所要放置的位置。可选的位置共有以下4种：&lt;/p&gt;&#xD;
&lt;ol&gt;&#xD;
&lt;li&gt;父SWF的应用程序域的新建子域 （默认方式）&lt;/li&gt;&#xD;
&lt;li&gt;子SWF 与父SWF的应用程序域合并&lt;/li&gt;&#xD;
&lt;li&gt;作为父域的系统域下的新建子域&lt;/li&gt;&#xD;
&lt;li&gt;在其他安全域下的系统域的新建子域&lt;/li&gt;&#xD;
&lt;/ol&gt;&#xD;
&lt;p&gt;前三种情况都是把子SWF加载到父域所处的安全域下，只有第四种是唯一一种把SWF加载到其他安全域下的方法。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://www.senocular.com/flash/tutorials/contentdomains/images/app_domain_placement.png" alt="Application Domain Placement" width="478" height="373" /&gt;&lt;br /&gt;加载子SWF时放置应用程序域的4种选择&lt;/p&gt;&#xD;
&lt;p&gt;还有一种没提到的方式，是你为某个已加载的SWF创建了应用程序域，再把其他子SWF中的定义合并到（或者继承）这个域的情况。这种特殊的放置方式需要复杂的应用程序域层级管理，你需要掌握&lt;a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html#parentDomain"&gt;ApplicationDomain.parentDomain&lt;/a&gt;的用法，在此提醒读者小心：这种方法通常在不同的安全沙箱下（本地或者网络）会有不同的行为。这种方式很不常见，所以在此不进行更深的探讨。&lt;/p&gt;&#xD;
&lt;p&gt;LoaderContext对象的&lt;a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/LoaderContext.html#applicationDomain" target="_blank"&gt;applicationDomain&lt;/a&gt;属性定义了放置应用程序域的方式。你可以用ApplicationDomain.currentDomain（类似于安全域的SecurityDomain.currentDomain）或者用new关键字新建一个&lt;a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html" target="_blank"&gt;ApplicationDomain&lt;/a&gt;实例来作为参数。在ApplicationDomain的构造函数里可以为新建的域指定父域，如果这个参数没有指定，则表示将该域直接作为系统域的子域。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;// 将定义放置到父SWF所在的应用程序域（当前应用程序域）&lt;/span&gt;&#xD;
&lt;span&gt;var&lt;/span&gt; current:ApplicationDomain = ApplicationDomain.&lt;span&gt;currentDomain&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
&lt;span&gt;// 将定义放置到父SWF所在的应用程序域的的子域&lt;/span&gt;&#xD;
&lt;span&gt;var&lt;/span&gt; currentChild:ApplicationDomain = &lt;span&gt;new&lt;/span&gt; ApplicationDomain&lt;span&gt;(&lt;/span&gt;current&lt;span&gt;)&lt;/span&gt;;&amp;lt;em&amp;gt;?&amp;lt;/em&amp;gt;&#xD;
&amp;nbsp;&#xD;
&lt;span&gt;// 将定义放置到父SWF所在的应用程序域的系统域&lt;/span&gt;&#xD;
&lt;span&gt;var&lt;/span&gt; systemChild:ApplicationDomain = &lt;span&gt;new&lt;/span&gt; ApplicationDomain&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;p&gt;下面的代码演示了使用LoaderContext对象传递ApplicationDomain实例给Loader.load方法，把一个子SWF加载到父SWF所处的应用程序域的子域下的例子。这种方式也是默认的加载行为。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;var&lt;/span&gt; context:LoaderContext = &lt;span&gt;new&lt;/span&gt; LoaderContext&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
&lt;span&gt;// 把子应用程序域作为当前应用程序域的子域&lt;/span&gt;&#xD;
&lt;span&gt;var&lt;/span&gt; current:ApplicationDomain = ApplicationDomain.&lt;span&gt;currentDomain&lt;/span&gt;;&#xD;
context.&lt;span&gt;applicationDomain&lt;/span&gt; = &lt;span&gt;new&lt;/span&gt; ApplicationDomain&lt;span&gt;(&lt;/span&gt;current&lt;span&gt;)&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
&lt;span&gt;var&lt;/span&gt; loader:Loader = &lt;span&gt;new&lt;/span&gt; Loader&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
&lt;span&gt;var&lt;/span&gt; &lt;span&gt;url&lt;/span&gt;:&lt;span&gt;String&lt;/span&gt; = &lt;span&gt;"child.swf"&lt;/span&gt;;&#xD;
loader.&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt; URLRequest&lt;span&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;, context&lt;span&gt;)&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;p&gt;ApplicationDomain实例在内部包含了不对ActionScript开放的层级位置信息。每个ApplicationDomain实例都是一个唯一引用，彼此之间不能相互比较。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;var&lt;/span&gt; current1:ApplicationDomain = ApplicationDomain.&lt;span&gt;currentDomain&lt;/span&gt;;&#xD;
&lt;span&gt;var&lt;/span&gt; current2:ApplicationDomain = ApplicationDomain.&lt;span&gt;currentDomain&lt;/span&gt;;&#xD;
&lt;span&gt;trace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;current1 == current2&lt;span&gt;)&lt;/span&gt;; &lt;span&gt;// false&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;你也不能通过parentDomain属性得到系统域的引用，只有通过new ApplicationDomain()才可以。&lt;/p&gt;&#xD;
&lt;h3 id="ApplicationDomainInheritance"&gt;Application Domain Inheritance 应用程序域的继承&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;定义的继承和类继承有点类似，两者都是子级可以访问父级的定义，而反之则不行。&lt;/p&gt;&#xD;
&lt;p&gt;区别在于，应用程序域的继承不允许子级覆盖父级的定义。如果子域中包含有与父域一样的定义（指的是完全限定名称一致，包括包路径）。那么父域中的定义会取代掉子域。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://www.senocular.com/flash/tutorials/contentdomains/images/child_inherit_definitions.png" alt="Child Application Domain Inheritance" width="470" height="189" /&gt;&lt;br /&gt;子域中的定义被父域覆盖&lt;/p&gt;&#xD;
&lt;p&gt;这是因为你不能改变一个已经存在的实例的类定义。如果新的定义在被加载进来以前就已经用旧的定义生成过实例，那么这个实例原先的类定义和新的类定义之间就会产生冲突。所以Flash Player保护原先的类定义不被重写来避免冲突。&lt;/p&gt;&#xD;
&lt;p&gt;这也意味着开发者不可能覆盖ActionScript API的原生定义。因为SWF所处的应用程序域肯定是系统域的子域，而系统域包含了所有原生的定义。所以就算子SWF中包含了同名的定义，也会被系统域中的定义所覆盖。&lt;/p&gt;&#xD;
&lt;p&gt;当向一个已经存在的应用程序域合并定义时，上述规则同样适用。只有与原先的域里的定义无冲突的定义才会被合并。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://www.senocular.com/flash/tutorials/contentdomains/images/combine_definitions.png" alt="Adding Definitions in Application Domain" width="470" height="189" /&gt;&lt;br /&gt;新增到应用程序域里的定义不会覆盖现有的定义&lt;/p&gt;&#xD;
&lt;p&gt;这种情况下，那些发生冲突但却被覆盖的定义就完全获取不到了。但是如果是继承的方式，就算子域中的那些冲突定义被父域中的定义覆盖掉，还是可以通过getDefinition方法从子域中提取出来，关于这点将在&lt;a href="http://kevincao.com/2010/11/application-domains/#GettingDefinitionsDynamically"&gt;动态获取定义&lt;/a&gt;章节中讨论。&lt;/p&gt;&#xD;
&lt;p&gt;加载到应用程序域中的定义在应用程序域的生命期里一直存在。在SWF卸载后，用于保存这个SWF内的定义的应用程序域也会从内存中卸载。但如果该SWF的定义是放在其他某个已经存在的应用程序域内的话，那么这些定义将一直存在于内存中，除非目标应用程序域所关联的那个SWF被卸载。如果一直把新的定义加载到一个已经存在的域内，比如为第一个被加载的SWF创建的域，那么定义所占用的内存就会一直增加。如果是一个不停加载子SWF的滚动广告应用的话，持续增加定义到相同的应用程序域内引起的内存增长问题显然不是预期的结果。&lt;/p&gt;&#xD;
&lt;p&gt;而且，用这种方式加载的定义不会随着子SWF的卸载而卸载，而是在第二次加载相同的子SWF的时候重用第一次加载时创建的定义。这通常不会有什么问题，但是这意味着再次加载相同SWF的时候静态类的状态不会重置。静态变量有可能是上次使用过的值，一定会和第一次加载进来的时候保持一致。&lt;/p&gt;&#xD;
&lt;p&gt;所以，不同的情况需要不同的解决方法。&lt;/p&gt;&#xD;
&lt;h3 id="ChildDomainsDefinitionVersioning"&gt;Child Domains: Definition Versioning 子域：定义的版本管理&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;定义的继承机制使得子域可以很方便的共享父域内的定义。也由于子域中的重名定义会被父域所覆盖的原因，父应用程序域拥有控制在子域中使用哪个版本的定义的权力。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://www.senocular.com/flash/tutorials/contentdomains/images/child_domain_inherits_parent.png" alt="Child Application Domain Inherits Parent Definitions" width="129" height="169" /&gt;&lt;br /&gt;子应用程序域继承自父域&lt;/p&gt;&#xD;
&lt;p&gt;考虑以下情形：一个基于SWF的网站使用不同的SWF文件来代表不同的页面。主SWF负责加载这些子页面。每个页面SWF基于一个相同的类库开发，具有相似的行为。比如都有一个PageTitle类来表示页面的标题文本。&lt;/p&gt;&#xD;
&lt;p&gt;假如在相同域下有另一个SWF也用到这些相同的子页面，但是需要把子页面的标题文本变为不可选（假设原先的属性是可选择）。要实现这个例子里的目的，在PageTitle类中，我们需要把TextField的selectable属性改为false。但这样改动的问题是会影响原先的SWF文件保持其本来的行为。&lt;/p&gt;&#xD;
&lt;p&gt;为了解决这个问题，我们可以把每个子页面都复制一份并重新编译。但这么做的话会占用更多的空间和网站流量。更好的办法是只编译第二个主SWF，把更新过的PageTitle类定义一起编译进去。然后在子页面在加载到子应用程序域的时候，这个类的定义就会被父域里的定义给覆盖。&lt;/p&gt;&#xD;
&lt;p&gt;原先所有子页面用的PageTitle类如下：&lt;/p&gt;&#xD;
&lt;pre &gt;package &lt;span&gt;{&lt;/span&gt;&#xD;
	&lt;span&gt;import&lt;/span&gt; flash.&lt;span&gt;display&lt;/span&gt;.&lt;span&gt;Sprite&lt;/span&gt;;&#xD;
	&lt;span&gt;import&lt;/span&gt; flash.&lt;span&gt;text&lt;/span&gt;.&lt;span&gt;TextField&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
	&lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; PageTitle &lt;span&gt;extends&lt;/span&gt; Sprite &lt;span&gt;{&lt;/span&gt;&#xD;
&amp;nbsp;&#xD;
		&lt;span&gt;private&lt;/span&gt; &lt;span&gt;var&lt;/span&gt; title:&lt;span&gt;TextField&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
		&lt;span&gt;public&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; PageTitle&lt;span&gt;(&lt;/span&gt;titleText:&lt;span&gt;String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&#xD;
			title = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;TextField&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
			title.&lt;span&gt;text&lt;/span&gt; = titleText;&#xD;
			addChild&lt;span&gt;(&lt;/span&gt;title&lt;span&gt;)&lt;/span&gt;;&#xD;
		&lt;span&gt;}&lt;/span&gt;&#xD;
	&lt;span&gt;}&lt;/span&gt;&#xD;
&lt;span&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;编译到第二个主文件里的更新版本的PageTitle类：&lt;/p&gt;&#xD;
&lt;pre &gt;package &lt;span&gt;{&lt;/span&gt;&#xD;
	&lt;span&gt;import&lt;/span&gt; flash.&lt;span&gt;display&lt;/span&gt;.&lt;span&gt;Sprite&lt;/span&gt;;&#xD;
	&lt;span&gt;import&lt;/span&gt; flash.&lt;span&gt;text&lt;/span&gt;.&lt;span&gt;TextField&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
	&lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; PageTitle &lt;span&gt;extends&lt;/span&gt; Sprite &lt;span&gt;{&lt;/span&gt;&#xD;
&amp;nbsp;&#xD;
		&lt;span&gt;private&lt;/span&gt; &lt;span&gt;var&lt;/span&gt; title:&lt;span&gt;TextField&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
		&lt;span&gt;public&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; PageTitle&lt;span&gt;(&lt;/span&gt;titleText:&lt;span&gt;String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&#xD;
			title = &lt;span&gt;new&lt;/span&gt; &lt;span&gt;TextField&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
			title.&lt;span&gt;text&lt;/span&gt; = titleText;&#xD;
			&amp;lt;strong&amp;gt;title.&lt;span&gt;selectable&lt;/span&gt; = &lt;span&gt;false&lt;/span&gt;;&amp;lt;/strong&amp;gt; &lt;span&gt;// changed&lt;/span&gt;&#xD;
			addChild&lt;span&gt;(&lt;/span&gt;title&lt;span&gt;)&lt;/span&gt;;&#xD;
		&lt;span&gt;}&lt;/span&gt;&#xD;
	&lt;span&gt;}&lt;/span&gt;&#xD;
&lt;span&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;把更新过的PageTitle类定义编译到新的主文件里面，并加载所有子页面到它们自己的子应用程序域中。&lt;/p&gt;&#xD;
&lt;pre &gt;PageTitle; &lt;span&gt;// 虽然没有直接用到PageTitle，但我们可以包含一个引用，让它被一同编译进来 &lt;/span&gt;&#xD;
&amp;nbsp;&#xD;
&lt;span&gt;// 加载子页面到它们自己的子应用程序域中&lt;/span&gt;&#xD;
&lt;span&gt;// 加载的SWF将会用父域里的PageTitle定义取代掉它们自带的&lt;/span&gt;&#xD;
&lt;span&gt;function&lt;/span&gt; addChildPage&lt;span&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;:&lt;span&gt;String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;:&lt;span&gt;void&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&#xD;
	&lt;span&gt;var&lt;/span&gt; context:LoaderContext = &lt;span&gt;new&lt;/span&gt; LoaderContext&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
	&lt;span&gt;var&lt;/span&gt; current:ApplicationDomain = ApplicationDomain.&lt;span&gt;currentDomain&lt;/span&gt;;&#xD;
	context.&lt;span&gt;applicationDomain&lt;/span&gt; = &lt;span&gt;new&lt;/span&gt; ApplicationDomain&lt;span&gt;(&lt;/span&gt;current&lt;span&gt;)&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
	&lt;span&gt;var&lt;/span&gt; loader:Loader = &lt;span&gt;new&lt;/span&gt; Loader&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
	addChild&lt;span&gt;(&lt;/span&gt;loader&lt;span&gt;)&lt;/span&gt;;&#xD;
	loader.&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt; URLRequest&lt;span&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;, context&lt;span&gt;)&lt;/span&gt;;&#xD;
&lt;span&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;这种方法可以在不用重新编译子内容的前提下改变其中的类行为，这都是由于父应用程序域中的定义会覆盖子域中的定义的原因。&lt;/p&gt;&#xD;
&lt;p&gt;注意在上面的例子也可以省略LoaderContext的使用，效果是一样的。&lt;/p&gt;&#xD;
&lt;p&gt;即便子SWF无需用作多重使用目的，更新主文件中的定义也比更新所有子文件的更加简单。实际上，子文件中甚至可以完全不用包含这些定义，只依赖于主文件提供。这就是我们将在&lt;a href="http://kevincao.com/2010/11/application-domains/#SameDomainRuntimeSharedLibraries"&gt;相同的域：运行时共享库&lt;/a&gt;章节里将展开讨论的。&lt;/p&gt;&#xD;
&lt;h3 id="SeparateDomainsPreventingConflicts"&gt;Separate Domains: Preventing Conflicts 域分离：避免冲突&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;某些情形下，你可能不希望加载的子SWF内容被父应用程序域里的定义继承关系所影响。因为有可能你甚至不知道父域中存在哪些定义。不论哪种情况，最好都要避免主SWF和子SWF中的定义共享。在这种情况下，应该把子SWF的定义放到新的系统域的子域下。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://www.senocular.com/flash/tutorials/contentdomains/images/child_system_domain_child.png" alt="Child SWF Domain as Child of System Domain" width="259" height="168" /&gt;&lt;br /&gt;系统域下的不同子应用程序域&lt;/p&gt;&#xD;
&lt;p&gt;由于父SWF和子SWF的定义之间没有继承关系，所以这时候即使存在相同的定义也不会引起冲突，因为二者属于不同的沙箱。&lt;/p&gt;&#xD;
&lt;p&gt;举个例子：比如你有个培训程序，通过加载外部SWF来代表不同的培训模块。这个程序已经有些年头了，许多开发者开发了成百上千个培训模块。这些模块，甚至培训主程序自身都是基于不同版本的基础代码库进行开发。所以主程序要保证自己使用的基础代码库不会对其他模块造成不兼容的情况。这就必须把这些培训模块加载到他们独立的系统域下的子域，而不是把他们加载到主应用程序域的子域下面。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;samp&gt;trainingapplication.swf:&lt;/samp&gt;&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;var&lt;/span&gt; moduleLoader:Loader = &lt;span&gt;new&lt;/span&gt; Loader&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
addChild&lt;span&gt;(&lt;/span&gt;moduleLoader&lt;span&gt;)&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
&lt;span&gt;// 把模块加载到系统域的子域下，与当前的应用程序域区分开&lt;/span&gt;&#xD;
&lt;span&gt;function&lt;/span&gt; loadModule&lt;span&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;:&lt;span&gt;String&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;:&lt;span&gt;void&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&#xD;
	&lt;span&gt;var&lt;/span&gt; context:LoaderContext = &lt;span&gt;new&lt;/span&gt; LoaderContext&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
	context.&lt;span&gt;applicationDomain&lt;/span&gt; = &lt;span&gt;new&lt;/span&gt; ApplicationDomain&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
	moduleLoader.&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt; URLRequest&lt;span&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;, context&lt;span&gt;)&lt;/span&gt;;&#xD;
&lt;span&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;不足的是，这种定义的划分方式还不是完全隔离的。由于在同一个安全域下的内容都处于一个相同的系统域下，任何对系统域内定义的修改都将影响同一个安全域下的所有应用程序域。即使是将子SWF加载到一个单独的系统域的子域下，父SWF对系统域的更改还是会对其造成影响。&lt;/p&gt;&#xD;
&lt;p&gt;我们可以通过改动XML.prettyIndent属性来验证这一点：不管处于应用程序域层级的哪个SWF对系统域里的定义作出改变，都会影响到相同安全域下的所有文件。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;samp&gt;parent.swf:&lt;/samp&gt;&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;trace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;XML&lt;/span&gt;.&lt;span&gt;prettyIndent&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;; &lt;span&gt;// 2&lt;/span&gt;&#xD;
&lt;span&gt;XML&lt;/span&gt;.&lt;span&gt;prettyIndent&lt;/span&gt; = &lt;span&gt;5&lt;/span&gt;;&#xD;
&lt;span&gt;trace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;XML&lt;/span&gt;.&lt;span&gt;prettyIndent&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;; &lt;span&gt;// 5&lt;/span&gt;&#xD;
&amp;nbsp;&#xD;
&lt;span&gt;var&lt;/span&gt; loader:Loader = &lt;span&gt;new&lt;/span&gt; Loader&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
&lt;span&gt;var&lt;/span&gt; context:LoaderContext = &lt;span&gt;new&lt;/span&gt; LoaderContext&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
&lt;span&gt;// 新建一个独立的应用程序域&lt;/span&gt;&#xD;
context.&lt;span&gt;applicationDomain&lt;/span&gt; = &lt;span&gt;new&lt;/span&gt; ApplicationDomain&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
&lt;span&gt;var&lt;/span&gt; &lt;span&gt;url&lt;/span&gt;:&lt;span&gt;String&lt;/span&gt; = &lt;span&gt;"child.swf"&lt;/span&gt;;&#xD;
loader.&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt; URLRequest&lt;span&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;, context&lt;span&gt;)&lt;/span&gt;;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;samp&gt;child.swf:&lt;/samp&gt;&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;trace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;XML&lt;/span&gt;.&lt;span&gt;prettyIndent&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;; &lt;span&gt;// 5&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;所以最佳实践是对定义做的改动应该在使用后及时还原，这样可以避免对其他文件的影响。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;var&lt;/span&gt; originalPrettyIndent:&lt;span&gt;int&lt;/span&gt; = &lt;span&gt;XML&lt;/span&gt;.&lt;span&gt;prettyIndent&lt;/span&gt;;&#xD;
&lt;span&gt;XML&lt;/span&gt;.&lt;span&gt;prettyIndent&lt;/span&gt; = &lt;span&gt;5&lt;/span&gt;;&#xD;
&lt;span&gt;trace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;myXML.&lt;span&gt;toXMLString&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
&lt;span&gt;XML&lt;/span&gt;.&lt;span&gt;prettyIndent&lt;/span&gt; = originalPrettyIndent;&lt;/pre&gt;&#xD;
&lt;p&gt;同样的，你也必须留心类似这样的值有可能在你的程序之外被人所改动。&lt;/p&gt;&#xD;
&lt;h3 id="SameDomainRuntimeSharedLibraries"&gt;Same Domain: Runtime Shared Libraries 相同的域：运行时共享库&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;把新增的定义增加到现有的应用程序域下可能是应用程序域最大的用处。因为继承只能把父域内的定义对子域共享，而合并定义到相同的应用程序域内则可以对所有使用这个域的SWF共享，包括父级和子级。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://www.senocular.com/flash/tutorials/contentdomains/images/parent_domain_adds_child.png" alt="Parent Domain Adds Child Definitions" width="129" height="169" /&gt;&lt;br /&gt;父应用程序域包括了子SWF的定义&lt;/p&gt;&#xD;
&lt;p&gt;运行时共享库（RSLs）正是运用了这种机制。RSLs是可以在运行时被加载的独立的代码库。通过RSLs，其他SWF可以共用其中的代码而不需要编译到自身，从而排除了冗余，减小了文件量，也让代码更容易维护。我们在主应用程序域中加载RSL，从而可以在整个程序中共享定义。&lt;/p&gt;&#xD;
&lt;p&gt;使用RSLs之前需要做些准备工作。首先，ActionScript编译器需要在发布SWF文件的时候知道哪些定义不需要被编译。&lt;/p&gt;&#xD;
&lt;p&gt;原生的Flash Player API定义就不需要编译。虽然每个SWF都需要用到原生的定义（Array，XML，Sprite等），但是这些定义只存在于Flash Player的可执行文件中，不需要也不会被编译到SWF文件中。编译器使用一个叫做playerglobal.swc的特殊SWC（预先编译的SWF类库）来识别原生定义。它包含了原生定义的接口，包括定义的名字和数据类型等。编译器通过它来编译SWF，而且不会把这些定义编译到最终的SWF中。&lt;/p&gt;&#xD;
&lt;p&gt;编译器还可以引用其他类似playerglobal.swc一样的SWC库。这些库作为&amp;ldquo;外部&amp;rdquo;类库，其中包含的定义只是用于编译，不会包含到SWF内部。&lt;/p&gt;&#xD;
&lt;p&gt;这里不详细讨论在编辑工具中如何进行库链接的设置。不同版本的编辑器的设置有些不同，具体方法请参考Flash文档。&lt;/p&gt;&#xD;
&lt;p&gt;虽然我们用SWCs来编译SWF，但实际上他们本身就是SWF文件，和其他被加载的SWF内容类似。在进行库编译的时候，同时生成了SWF和SWC文件。SWF用于运行时加载，而SWC在编译时用做外部库。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img src="http://www.senocular.com/flash/tutorials/contentdomains/images/compile_shared_library.png" alt="Compiling a Shared Library" width="469" height="243" /&gt;&lt;br /&gt;编译器使用SWCs共享库，SWF共享库在运行时加载&lt;/p&gt;&#xD;
&lt;p&gt;另一个准备工作需要编写代码。使用外部库的时候，发布的SWF中不包含库中的定义。如果Flash Player尝试运行其中代码，就会产生核查错误，整个SWF基本上就瘫痪了。&lt;/p&gt;&#xD;
&lt;p&gt;Flash Player会在类第一次使用的时候校验其定义。如果应用程序域中不包括该定义，那么校验错误就会产生。&lt;/p&gt;&#xD;
&lt;p&gt;实际上缺少定义产生的错误有两种。校验错误是两种之中最糟的，表示类无法正常工作的灾难性失败。另一种是引用错误，当某种数据类型被引用但是却不可用的情况下发生。虽然缺失定义也会造成引用错误，但这种错误只会在已经经过核查的类内部打断代码执行的正常过程。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;var&lt;/span&gt; instance:DoesNotExist;&#xD;
&lt;span&gt;// VerifyError: Error #1014: Class DoesNotExist could not be found.&lt;/span&gt;&#xD;
&lt;span&gt;// 当Flash Player校验包含该定义的类时发生校验错误&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;pre &gt;&lt;span&gt;var&lt;/span&gt; instance:&lt;span&gt;Object&lt;/span&gt; = &lt;span&gt;new&lt;/span&gt; DoesNotExist&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
&lt;span&gt;// ReferenceError: Error #1065: Variable DoesNotExist is not defined.&lt;/span&gt;&#xD;
&lt;span&gt;// 当代码执行到这一行的时候发生引用错误&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;主要的区别在于校验错误与类定义有关，而引用错误与代码执行相关。在类内部的代码要执行之前，必须要先通过校验。上面的例子中instance对象声明为Object类型，校验可以正常通过（只是在执行的时候就会遇到引用错误）。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;&lt;strong&gt;Note: Strict Mode 注意：严格模式&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;外部库是引用定义而不需将其编译到SWF中的一种方法。另一种方法是关闭严格模式，这将大大放宽了对变量使用的检查。对于类的使用来说，你可以引用一个不存在的类而不会引起编译器报错。你不能直接把不存在的类用作变量类型（这样做会在运行时产生校验错误），但是你可以像上面的&amp;ldquo;引用错误&amp;rdquo;例子中那样去引用。在非严格模式下，编译器也许会检测不到一些可能发生的错误，所以通常不建议用这种模式。&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;p&gt;使用了RSLs的SWF文件必须保证先加载好RSLs，才能使用这些外部定义。我们应该在主应用程序开始执行之前用一个预加载器来加载RSLs。&lt;/p&gt;&#xD;
&lt;p&gt;下面演示了一个SWF加载包含Doughnut类的外部RSL的例子。虽然在SWF中直接引用了这个类，但是它却是编译在外部库中，并通过SWC的方式来引用的。RSL在Doughnut类第一次使用之前就被加载进来，所以不会造成校验错误。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;samp&gt;Doughnut.as&lt;/samp&gt;&amp;nbsp;(编译为&amp;nbsp;&lt;samp&gt;doughnutLibrary.swc&lt;/samp&gt;&amp;nbsp;和&amp;nbsp;&lt;samp&gt;doughnutLibrary.swf&lt;/samp&gt;):&lt;/p&gt;&#xD;
&lt;pre &gt;package &lt;span&gt;{&lt;/span&gt;&#xD;
	&lt;span&gt;import&lt;/span&gt; flash.&lt;span&gt;display&lt;/span&gt;.&lt;span&gt;Sprite&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
	&lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; Doughnut &lt;span&gt;extends&lt;/span&gt; Sprite &lt;span&gt;{&lt;/span&gt;&#xD;
		&lt;span&gt;public&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; Doughnut&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&#xD;
&amp;nbsp;&#xD;
			&lt;span&gt;// draw a doughnut shape&lt;/span&gt;&#xD;
			graphics.&lt;span&gt;beginFill&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;0xFF99AA&lt;span&gt;)&lt;/span&gt;;&#xD;
			graphics.&lt;span&gt;drawCircle&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;, &lt;span&gt;0&lt;/span&gt;, &lt;span&gt;50&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
			graphics.&lt;span&gt;drawCircle&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;, &lt;span&gt;0&lt;/span&gt;, &lt;span&gt;25&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
		&lt;span&gt;}&lt;/span&gt;&#xD;
	&lt;span&gt;}&lt;/span&gt;&#xD;
&lt;span&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;samp&gt;ShapesMain.as&lt;/samp&gt;&amp;nbsp;(&lt;samp&gt;Shapes.swf的主类&lt;/samp&gt;):&lt;/p&gt;&#xD;
&lt;pre &gt;package &lt;span&gt;{&lt;/span&gt;&#xD;
	&lt;span&gt;import&lt;/span&gt; flash.&lt;span&gt;display&lt;/span&gt;.&lt;span&gt;Sprite&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
	&lt;span&gt;public&lt;/span&gt; &lt;span&gt;class&lt;/span&gt; ShapesMain &lt;span&gt;extends&lt;/span&gt; Sprite &lt;span&gt;{&lt;/span&gt;&#xD;
		&lt;span&gt;public&lt;/span&gt; &lt;span&gt;function&lt;/span&gt; ShapesMain&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&#xD;
&amp;nbsp;&#xD;
			&lt;span&gt;// 虽然并没有编译到Shapes.swf中，&lt;/span&gt;&#xD;
			&lt;span&gt;// 但是我们通过doughnutLibrary.swc外部库&lt;/span&gt;&#xD;
			&lt;span&gt;// 可以获得对Doughnut类的引用&lt;/span&gt;&#xD;
			&lt;span&gt;var&lt;/span&gt; donut:Doughnut = &lt;span&gt;new&lt;/span&gt; Doughnut&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
			donut.&lt;span&gt;x&lt;/span&gt; = &lt;span&gt;100&lt;/span&gt;;&#xD;
			donut.&lt;span&gt;y&lt;/span&gt; = &lt;span&gt;100&lt;/span&gt;;&#xD;
			addChild&lt;span&gt;(&lt;/span&gt;donut&lt;span&gt;)&lt;/span&gt;;&#xD;
		&lt;span&gt;}&lt;/span&gt;&#xD;
	&lt;span&gt;}&lt;/span&gt;&#xD;
&lt;span&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;&lt;samp&gt;Shapes.swf&lt;/samp&gt;&amp;nbsp;(RSL loader):&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;var&lt;/span&gt; rslLoader:Loader = &lt;span&gt;new&lt;/span&gt; Loader&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
rslLoader.&lt;span&gt;contentLoaderInfo&lt;/span&gt;.&lt;span&gt;addEventListener&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;Event.&lt;span&gt;INIT&lt;/span&gt;, rslInit&lt;span&gt;)&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
&lt;span&gt;// 把RSL中的定义加载到当前应用程序域中&lt;/span&gt;&#xD;
&lt;span&gt;var&lt;/span&gt; context:LoaderContext = &lt;span&gt;new&lt;/span&gt; LoaderContext&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
context.&lt;span&gt;applicationDomain&lt;/span&gt; = ApplicationDomain.&lt;span&gt;currentDomain&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
&lt;span&gt;var&lt;/span&gt; &lt;span&gt;url&lt;/span&gt;:&lt;span&gt;String&lt;/span&gt; = &lt;span&gt;"doughnutLibrary.swf"&lt;/span&gt;;&#xD;
rslLoader.&lt;span&gt;load&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt; URLRequest&lt;span&gt;(&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;, context&lt;span&gt;)&lt;/span&gt;;&#xD;
&amp;nbsp;&#xD;
&lt;span&gt;function&lt;/span&gt; rslInit&lt;span&gt;(&lt;/span&gt;event:Event&lt;span&gt;)&lt;/span&gt;:&lt;span&gt;void&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&#xD;
	&lt;span&gt;// 只有当RSL中的定义导入到当前应用程序域以后&lt;/span&gt;&#xD;
	&lt;span&gt;// 我们才能用其中的Doughnut定义通过ShapesMain类的校验&lt;/span&gt;&#xD;
	addChild&lt;span&gt;(&lt;/span&gt;&lt;span&gt;new&lt;/span&gt; ShapesMain&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
&lt;span&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;在这个例子中，Shapes.swf是主程序，当RSL加载完毕后实例化主类ShapesMain。如果没有导入RSL中的定义，创建ShapesMain实例的时候就会因为在应用程序域中找不到对应的类而发生校验错误。&lt;/p&gt;&#xD;
&lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;&#xD;
&lt;p&gt;&lt;strong&gt;注意：Flex中的RSL&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这里讨论的方法是最底层的方法，不应该用于Flex开发。Flex框架中有自己的一套RSLs处理机制，更多关于RSL在Flex中的应用，请参考&lt;a href="http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7fd1.html"&gt;Flex Runtime Shared Libraries (Flex 4)&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;/blockquote&gt;&#xD;
&lt;h3 id="GettingDefinitionsDynamically"&gt;Getting Definitions Dynamically 动态获取定义&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;我们可以用&lt;a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html#getDefinition()" target="_blank"&gt;Application.getDefinition&lt;/a&gt;方法获取不在应用程序域内的定义，或者被父域覆盖的定义。这个方法返回应用程序域及其任意父域内的定义引用。在当前应用程序域内使用getDefinition方法的效果等同于全局函数&lt;a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/package.html#getDefinitionByName()" target="_blank"&gt;getDefinitionByName&lt;/a&gt;。&lt;/p&gt;&#xD;
&lt;p&gt;我们也可以通过SWF的&lt;a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/LoaderInfo.html#applicationDomain" target="_blank"&gt;LoaderInfo.applicationDomain&lt;/a&gt;来获得在ApplicationDomain.currentDomain以外的应用程序域。在下面的例子中我们用Loader加载了一个SWF文件，然后在加载的那个应用程序域中提取com.example.Box类的定义。&lt;/p&gt;&#xD;
&lt;pre &gt;&lt;span&gt;try&lt;/span&gt; &lt;span&gt;{&lt;/span&gt;&#xD;
	&lt;span&gt;var&lt;/span&gt; &lt;span&gt;domain&lt;/span&gt;:ApplicationDomain = loader.&lt;span&gt;contentLoaderInfo&lt;/span&gt;.&lt;span&gt;applicationDomain&lt;/span&gt;;&#xD;
	&lt;span&gt;var&lt;/span&gt; boxClass:&lt;span&gt;Class&lt;/span&gt; = &lt;span&gt;domain&lt;/span&gt;.&lt;span&gt;getDefinition&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;"com.example.Box"&lt;/span&gt;&lt;span&gt;)&lt;/span&gt; as &lt;span&gt;Class&lt;/span&gt;;&#xD;
	&lt;span&gt;var&lt;/span&gt; boxInstance:&lt;span&gt;Object&lt;/span&gt; = &lt;span&gt;new&lt;/span&gt; boxClass&lt;span&gt;(&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
&lt;span&gt;}&lt;/span&gt;&lt;span&gt;catch&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;err:&lt;span&gt;Error&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&#xD;
	&lt;span&gt;trace&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;err.&lt;span&gt;message&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;;&#xD;
&lt;span&gt;}&lt;/span&gt;&lt;/pre&gt;&#xD;
&lt;p&gt;以上的例子中包含了两个知识点。首先，getDefinition方法的返回值被显式的转换为Class类型，这是因为getDefinition默认返回的是Object类型，有可能代表了除了类类型以外的其他类型（函数，命名空间，接口）。其次，这个操作应该要放在try-catch函数体内，因为如果getDefinition查找定义失败将会抛出错误。或者你也可以在使用getDefinition之前用&lt;a href="http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ApplicationDomain.html#hasDefinition()" target="_blank"&gt;ApplicationDomain.hasDefinition&lt;/a&gt;方法检测是否能够成功找到某个定义。&lt;/p&gt;&#xD;
&lt;p&gt;用动态方式去获取的定义，而不是那些在当前应用程序域（及继承的程序域内）的定义，是不能用作变量类型的。就像RSL一样，在应用程序域内找不到的类定义会在校验的时候报错。所以上面的例子中boxInstance变量声明为Object类型而不是Box类型，就是因为Box类的定义在应用程序域内不存在。&lt;/p&gt;&#xD;
&lt;h3 id="SamedefinitionCollisions"&gt;Same-definition Collisions 相同定义的冲突&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;有些时候可能会发生你引用的定义匹配到另外的应用程序域里的定义的交叉情况。这种情况将会产生如下强制转换类型错误：&lt;/p&gt;&#xD;
&lt;pre &gt;TypeError: &lt;span&gt;Error&lt;/span&gt; &lt;span&gt;#1034: Type Coercion failed: cannot convert&lt;/span&gt;&#xD;
	com.&lt;span&gt;example&lt;/span&gt;::MyClass@51e1101 to com.&lt;span&gt;example&lt;/span&gt;.&lt;span&gt;MyClass&lt;/span&gt;.&lt;/pre&gt;&#xD;
&lt;p&gt;你可以看到在不同内存空间里的定义用@符号进行了区分。虽然它们内部的代码可能是完全相同的（或不同），但是由于它们存在不同的应用程序域（或安全域）内，所以它们是两个不同的定义。&lt;/p&gt;&#xD;
&lt;p&gt;只有像Object那样的原生Flash Player定义才可以将位于不同域（甚至是跨安全域的）的定义关联起来。实际上，大多数时候声明一个跨域的变量类型的时候都需要用Object类型。&lt;/p&gt;&#xD;
&lt;p&gt;虽然我们可以用Object这种通用类型来解决定义冲突错误，实际上我们更应该合理安排应用程序域的位置来消除这种不匹配的情况。&lt;/p&gt;&#xD;
&lt;h3 id="Conclusion"&gt;Conclusion 总结&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;这篇教程包含了很多方面的信息。前半部分讨论了什么是安全域，以及它如何影响来自不同域的内容。Flash Player用这种安全沙箱机制保护用户的数据。Flash开发者应该了解并合理利用这种限制。&lt;/p&gt;&#xD;
&lt;p&gt;第二部分讨论了应用程序域&amp;mdash;&amp;mdash;另一种用于在安全沙箱内划分ActionScript定义的沙箱类型。应用程序域的层级机制提供了在不同的SWF直接共享和重用定义的方法。&lt;/p&gt;&#xD;
&lt;p&gt;在安全域和应用程序域的概念上有很多容易犯的错误。希望这篇教程能够帮你对此有所准备。你不仅应当了解他们的运作方式，还要知道如何正确运用它们以达成你想要的效果。&lt;/p&gt;&#xD;
&lt;p&gt;&lt;strong&gt;译者注：&lt;/strong&gt;&lt;/p&gt;&#xD;
&lt;p&gt;通过这篇文章的翻译，我才真正体会了翻译工作的难做。虽然平时看英文资料的速度还挺快，但是用中文详细复述一遍需要多花好几十倍的时间。在这篇教程的翻译中，我没有使用全文翻译等辅助工具，完全靠手打，一边翻译一遍领会作者的意图。感觉收获还是比单纯看一遍要来得更多一些。&lt;/p&gt;&#xD;
&lt;p&gt;本文介绍的知识相当重要，特别是从AS2时代成长起来的开发者很容易就掉进文中提到的一些陷阱。完全掌握这部分知识对设计模块架构，管理内存等方面都有很大的帮助。在此要再次感谢原作者&lt;a href="http://www.senocular.com/" target="_blank"&gt;senocular&lt;/a&gt;为我们带来这么精彩的教程。&lt;/p&gt;&#xD;
&lt;img src="http://www.cnblogs.com/yintian2/aggbug/1977924.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yintian2/archive/2011/03/09/1977924.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yintian2/archive/2010/04/25/1719675.html</id><title type="text">弄了个新blogs 欢迎捧场</title><summary type="text">一直在想要不要继续自己的想法今天还是决定继续其实可以更简单下面是地址欢迎大家b踩啊http://et-fly.com</summary><published>2010-04-24T17:11:00Z</published><updated>2010-04-24T17:11:00Z</updated><author><name>阴天&amp;amp;#183;爱</name><uri>http://www.cnblogs.com/yintian2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yintian2/archive/2010/04/25/1719675.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yintian2/archive/2010/04/25/1719675.html"/><content type="html">&lt;p&gt;一直在想要不要继续自己的想法&lt;/p&gt;&#xD;
&lt;p&gt;今天还是决定继续&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;其实&lt;/p&gt;&#xD;
&lt;p&gt;可以&lt;/p&gt;&#xD;
&lt;p&gt;更简单&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;下面是地址&lt;/p&gt;&#xD;
&lt;p&gt;欢迎大家b踩啊&lt;/p&gt;&#xD;
&lt;p&gt;&lt;a href="http://et-fly.com"&gt;http://et-fly.com&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/yintian2/aggbug/1719675.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/yintian2/archive/2010/04/25/1719675.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/yintian2/archive/2010/01/22/1654245.html</id><title type="text">PHP 实用便捷代码（转）</title><summary type="text">PHP 是目前使用最广泛的基于 Web 的编程语言，驱动着数以百万计的网站，其中也包括如 Facebook 等一些大型站点。这里收集了 21 段实用便捷的 PHP 代码摘录，对每种类型的 PHP 开发者都会有所帮助。</summary><published>2010-01-22T07:44:00Z</published><updated>2010-01-22T07:44:00Z</updated><author><name>阴天&amp;amp;#183;爱</name><uri>http://www.cnblogs.com/yintian2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yintian2/archive/2010/01/22/1654245.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yintian2/archive/2010/01/22/1654245.html"/></entry><entry><id>http://www.cnblogs.com/yintian2/archive/2009/09/22/1571632.html</id><title type="text">一个鼠标拖出一个圆形的简单demo</title><summary type="text">中间最主要的是圆半径的求法小学数学勾股定理转换为计算机语言就是var radius:Number = Math.sqrt(Math.pow(thisWidth, 2) + Math.pow(thisHeight, 2));</summary><published>2009-09-22T02:30:00Z</published><updated>2009-09-22T02:30:00Z</updated><author><name>阴天&amp;amp;#183;爱</name><uri>http://www.cnblogs.com/yintian2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yintian2/archive/2009/09/22/1571632.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yintian2/archive/2009/09/22/1571632.html"/></entry><entry><id>http://www.cnblogs.com/yintian2/archive/2008/12/19/1358167.html</id><title type="text">Flex中不使用FelxPrintJob通过ExternalInterface直接调用JavaScript利用浏览器本身的功能进行打印 </title><summary type="text">Flex中不使用FelxPrintJob通过ExternalInterface直接调用JavaScript利用浏览器本身的功能进行打印 </summary><published>2008-12-19T03:35:00Z</published><updated>2008-12-19T03:35:00Z</updated><author><name>阴天&amp;amp;#183;爱</name><uri>http://www.cnblogs.com/yintian2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yintian2/archive/2008/12/19/1358167.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yintian2/archive/2008/12/19/1358167.html"/></entry><entry><id>http://www.cnblogs.com/yintian2/archive/2008/07/30/1256131.html</id><title type="text">HttpModule 工作原理（转）</title><summary type="text">当一个HTTP请求到达HttpModule时，整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理，也就是说此时对于HTTP请求来讲，HttpModule是一个HTTP请求的“必经之路”，所以可以在这个HTTP请求传递到真正的请求处理中心（HttpHandler）之前附加一些需要的信息在这个HTTP请求信息之上，或者针对截获的这个HTTP请求信息作一些额外的工作，或者在某些情况下干脆终止满足一些条件的HTTP请求，从而可以起到一个Filter过滤器的作用。</summary><published>2008-07-30T01:34:00Z</published><updated>2008-07-30T01:34:00Z</updated><author><name>阴天&amp;amp;#183;爱</name><uri>http://www.cnblogs.com/yintian2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yintian2/archive/2008/07/30/1256131.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yintian2/archive/2008/07/30/1256131.html"/></entry><entry><id>http://www.cnblogs.com/yintian2/archive/2008/06/12/1218089.html</id><title type="text">Flex 拖拽</title><summary type="text">Flex 拖拽范例Flex由于在其Framwork里加入了DragDrop管理器，可以使得开发者在Flex应用中实现类似桌面的效果，默认情况下，Flex的拖拽管理器是针对List等控件的，实现这类控件之间的Item拖拽非常容易。下面是一个很简单的小例子：代码如下：&amp;lt;?xmlversion="1.0"encoding="utf-8"?&amp;gt;&amp;lt;mx:Applicationxmlns:mx...</summary><published>2008-06-12T01:14:00Z</published><updated>2008-06-12T01:14:00Z</updated><author><name>阴天&amp;amp;#183;爱</name><uri>http://www.cnblogs.com/yintian2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yintian2/archive/2008/06/12/1218089.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yintian2/archive/2008/06/12/1218089.html"/></entry><entry><id>http://www.cnblogs.com/yintian2/archive/2008/06/11/1217516.html</id><title type="text">ASP.NET防止盗链(转)</title><summary type="text">所谓盗链就是指其他网站把我们站点的文件链接帖到他们站上，这样白白占用我们的带宽。访问对于网站盗链行为，是非常不道德的。要实现防盗链，我们就得在IIS处理URL时拦截。</summary><published>2008-06-11T10:06:00Z</published><updated>2008-06-11T10:06:00Z</updated><author><name>阴天&amp;amp;#183;爱</name><uri>http://www.cnblogs.com/yintian2/</uri></author><link rel="alternate" href="http://www.cnblogs.com/yintian2/archive/2008/06/11/1217516.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/yintian2/archive/2008/06/11/1217516.html"/></entry></feed>
