2014-11-02 3 views
1

У меня есть утечка памяти:Удалить обработчик события из памяти (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 именно поэтому каждый раз, когда окно открыто события дублируются. Прикрепите событие закрытия к рассматриваемому объекту окна, который вызывает функцию для удаления всех eventListeners, тем самым удаляя их из памяти приложений.

+0

Да, это так. – bobo2000

Смежные вопросы