Клуб API Карт

Помогите разобраться с памятью

dreval.s
15 августа 2011, 18:18

Карта сьедает очень много памяти и через некоторое время просто вешается

gCollection.forEach(function (obj, objIndex, group) {
                        if (obj.id == k) { obj.openBalloon( };
                        YMaps.Events.observe(obj, obj.Events.BalloonOpen, function () {
                            k = obj.id;
                        }, this);

                        YMaps.Events.observe(obj, obj.Events.BalloonClose, function () {
                            if (k2 != "1") { k = 0; };
                        }, this);

из-за этого кода,  содержимое коллекции может меняться каждые 10 сек, поэтому данный код запихнут в таймер, коллекция каждые 10 сек очищается....что может быть не так?

7 комментариев
Подписаться на комментарии к посту

попробуйте два варианта

1. вынесите функцию обработчик в отдельную функцию( можете погуглить как замыкания любят кушать память)

2. Перед тем тем вешаться на ивент(observe) - подчистите там. Быть может у вас получается много обработчиков на BallonOpen\Close хотя и не должно.

А точно могу подсказать только увидив приложение в живую

в принципе суть проблемы в том, чтоб при переррисовке обьектов в коллекции сохранялся открытый пользователем балун, то есть пользователь открыл балун, происходит перерисовка и балун не исчезает,а остается открытым, возможно есть еще какие-то варианты решения этой проблемы

Вот http://pastebin.com/yKdkrgFm я убрал лишнее с кода, оставил только саму логику....подскажите что не так и из-за чего память может так сьедаться...

так же используется поворот картинки в setIconContent средствами фильтров IE, возможно они тоже сьедают часть памяти?

если функция "ee" сейчас не работает то вроде больше ничего не должно кушать память.

Могу посоветовать запустить приложение под хромом - у него есть статистика выделения памяти.

Там хоть и нельзя понять где, но можно понять кто.

Как только раскомментирую var listener = YMaps.Events.observe(obj, obj.Events.BalloonOpen, function BOpen() { k = obj.id; listener.cleanup;  }); сразу начинает неимоверно кушаться память, я правильно чишу ивенты?  и может как проверить очистился прошлый ивент или нет, возможно есть способ очищать сразу все ивенты с карты

у вас cleanup на ballonopen\close будет срабатывать только при наступлении этих дейсвий.

А их нет.

Но снятие обработчика вам не поможет - замыкание которое вы создаете в обработчике видит obj и листенер, пока оно не будет уничтоженно(а оно не будет) у вас будет утекать память.

Я вам в самом начале советовал эти функции определить в другом месте.

я отфоркал ваш код немного - http://pastebin.com/0516hN0h

вроде не должен утекать