加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

flash – ExternalInterface.call在IE 9中泄漏

发布时间:2020-12-15 07:28:01 所属栏目:百科 来源:网络整理
导读:我创建了一个非常简单的SWF来演示: package { import flash.display.MovieClip; import flash.events.Event; import flash.external.ExternalInterface; public class FlashIELeak extends MovieClip { public function FlashIELeak() { addEventListener(E
我创建了一个非常简单的SWF来演示:

package {
    import flash.display.MovieClip;
    import flash.events.Event;
    import flash.external.ExternalInterface;

    public class FlashIELeak extends MovieClip {

        public function FlashIELeak() {
            addEventListener(Event.ENTER_FRAME,onFrame);
        }

        private function onFrame(e:Event):void {
            ExternalInterface.call("test",null);
        }
    }
}

在Chrome中加载,没有问题.记忆保持或多或少固定.

在IE和内存中的负载只是持续上升 – 大约30k / s.您甚至不需要声明测试功能.只是将swf嵌入页面中,你就会泄漏.在我们的项目中,我们传递了一个具有多个属性的对象,IE正在以120k / s的速度泄漏.不好.

有人见过这个吗?我无法找到与此相关的任何其他帖子.

解决方法

大约两年前在俄罗斯着名博客上发帖. Alexander Kozlovskij(又名Fizzer)解释了这个问题.以下是他创建的解决方法:

package ru.kozlovskij.external
{
    import flash.external.ExternalInterface;
    /**
     * @author a.kozlovskij
     * @copy flash.external.ExternalInterface
     */
    public final class ExternalInterfaceExtended
    {
        private static const instance :ExternalInterfaceExtended= new ExternalInterfaceExtended();
        private static var methodName :String;

        /**
         * U can't instanciate this class,because it implements a Singletone pattern.
         * @copy flash.external.ExternalInterface.ExternalInterface()
         */
        public function ExternalInterfaceExtended()
        {
            instance && new ExternalInterface();
            methodName = '__flash__addCallback_' + ExternalInterface.objectID;
        }

        private static function updateJS():void
        {
            const jsFunc :String = 'function(){ ' +
                methodName + ' = __flash__addCallback = function(flashObj,methodName)' +
                '{' +
                '    alert("JS: called overridden __flash__addCallback(" + arguments[0] + "," + arguments[1] + ")");' +
                '    flashObj[methodName] = ' +
                '     (function(methodName)' +
                '     {' +
                '     return function()' +
                '     {' +
                '     this.CallFunction('' + __flash__argumentsToXML(arguments,+ '');' +
                '     };' + //dangling semi-colon for IE 6
                '     })(methodName);' + //force re-closure to prevent IE memory leaks
                '};' +
                '}';

            ExternalInterface.call(jsFunc);
        }

        /**
         * Fixed: Mem leaks in native addCallback-js-closure.
         * @copy flash.external.ExternalInterface.addCallback()
         */
        public static function addCallback(functionName :String,closure :Function):void
        {
            updateJS();
            ExternalInterface.addCallback(functionName,closure);
            //ExternalInterface.call(methodName,functionName);
            //ExternalInterface.call('__flash__addCallback_ext',null,functionName);
        }

        /**
         * @copy flash.external.ExternalInterface.call()
         */
        public static function call(functionName :String,...parameters :Array):*
        {
            parameters.unshift(functionName);
            return ExternalInterface.call.apply(ExternalInterfaceExtended,parameters);
        }

        /**
         * @copy flash.external.ExternalInterface.available
         */
        public static function get available():Boolean
        {
            return ExternalInterface.available;
        }

        /**
         * @copy flash.external.ExternalInterface.objectID
         */
        public static function get objectID():String
        {
            return ExternalInterface.objectID;
        }

        /**
         * @copy flash.external.ExternalInterface.marshallExceptions
         */
        public static function get marshallExceptions():Boolean
        {
            return ExternalInterface.marshallExceptions;
        }

        public static function set marshallExceptions(value :Boolean):void
        {
            ExternalInterface.marshallExceptions = value;
        }
    }
}

因此,您只需要使用ExternalInterfaceExtended类而不是常规的ExternalInterface.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读