Удалить обработчик событий из памяти (ortc), титан

У меня утечка памяти:

    var ortc = require("co.realtime.ortc");

        function ortcNot() {

                ortc.clusterUrl = 'http://ortc-developers.realtime.co/server/2.2';
                ortc.connectionMetadata = 'Titanium Example';

                ortc.addEventListener('onException', function(e) {
                    Ti.API.info('Exception: ' + e.info);
                });

                ortc.addEventListener('onConnected', function(e) {
                    Ti.API.info('Connected to ORTC server');
                    ortc.subscribe('yellow24', true);
                });

                ortc.addEventListener('onDisconnected', function(e) {
                    Ti.API.info('Disconnected from ORTC');
                    //remove event handlers
                    //ortc = null;

                });

                ortc.addEventListener('onSubscribed', function(e) {
                    Ti.API.info('Subscribed to: ' + e.channel);
                    Ti.API.info('Sending a message to: ' + e.channel);
                    //ortc.send(e.channel, 'Message from iPhone');
                });

                ortc.addEventListener('onUnsubscribed', function(e) {
                    Ti.API.info('Unsubscribed from: ' + e.channel);
                    ortc.disconnect();
                });

                ortc.addEventListener('onMessage', function(e) {
                    Ti.API.info('Message received: ' + e.message + ' at channel: ' + e.channel);
                    //parse message
                    var message = JSON.parse(e.message);

                    alert(message.user.message);

                    //check chat id
                    if (message.id == args.chatId) {

                        recieveMessage(message);

                    }
                    //ortc.unsubscribe(e.channel);
                    Ti.API.info(ortc.isConnected());
                });


            ortc.connect('yellow2');

        }

ortcNot();

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

Есть идеи, почему это происходит, и как это решить? Спасибо

1 ответ

Решение

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

Чтобы удалить eventListener, он должен быть идентичным как в addEventListener, так и в removeEventListener, объявляя его как функцию и назначая его для eventListener. например

var viewObject = null;

function eventTodo(){
  // do stuff here ...

  viewObject.removeEventListener('click', eventTodo);
}

function addListener() {
    viewObject = Ti.UI.createView();
    viewObject.addEventListener('click', eventTodo);

   return viewObject;
}

Когда вы закрываете окно, вы не вызываете removeEventLister, поэтому при каждом открытии окна события дублируются. Прикрепите событие close к рассматриваемому объекту окна, который вызывает функцию для удаления всех EventListener, таким образом удаляя их из памяти приложений.

Другие вопросы по тегам