вторник, января 12, 2010

Утечка памяти в IE 8

Столкнулся со следующей проблемой. Есть простое приложение, использующее ExternalInterface.addCallback:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
applicationComplete="appCompleteHandler();">
<mx:Script>
<![CDATA[
private function appCompleteHandler():void {
if (ExternalInterface.available) {
ExternalInterface.addCallback("getWidth", getWidth);
}
}

private function getWidth():Number {
return width;
}
]]>
</mx:Script>
</mx:Application>

Флешка вставлена через swfobject. В IE8 при перезагрузке страницы видно, что память отданная под страничку с флешом не освобождается, что приводит к падению браузера через несколько перезагрузок. Немного поискав, нашел в swfobject 2.2 метод:

swfobject.removeSWF(objElemIdStr)

Removes a SWF from your web page. Is especially built to safely (only remove a SWF after it has been loaded, to avoid broken references) and completely (nullify references to avoid memory leaks) remove a SWF in Internet Explorer.

И помогло :)

2 комментария:

peko комментирует...

Пол года назад у меня был проект насыщенный графикой, в ходе которого клиент съел мне весь моск по поводу утечек. Пришлось готовый проект переписывать почти заново, избавлятся от динамически создаваемых объектов, переносить методы в статику и тд.

Под конец понял, что нужно было просто сразу посылать, т.к. в IE память течёт подефолту, т.е. это не всегда связано с качеством кода!

Есть подтвержденные сообщения, что особенно ослу становится хреново если установлен плагин от Skype (скайп обещал исправится, может уже пофиксили)

Короче очень больная тема, если кто-то столкнется с ней - не завидую, т.к. зачастую решения проблемы может и не быть. Вдвойне обидно если ситуация с утечками всплывает под конец проекта.

Oдно радует, пройдя чере всё это, ты уже как-то иначе думаешь и экономнее (с точки зрения памяти) пишешь код ...

Andrey Gorbatov комментирует...

Про скайп знаю, но такового не стоит. Как же послать человека с IE? :)