ios
  • titanium-mobile
  • titanium-alloy
  • ortc
  • 2014-11-02 41 views 1 likes 
    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这就是为什么每次打开的窗口中的事件被复制的窗口。将一个关闭事件附加到调用函数的窗口对象,以删除所有eventListener,从应用程序内存中删除它们。

    +0

    是的,没错。 – bobo2000 2015-02-04 15:29:00

    相关问题