【问题标题】:Remove event handler from memory (ortc) , titanium从内存中删除事件处理程序(ortc),钛
【发布时间】:2014-11-02 15:13:44
【问题描述】:

我有内存泄漏:

    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();

当我关闭我的控制器窗口时,然后重新打开该窗口。旧的事件监听器仍在内存中,导致创建重复的事件监听器。

知道为什么会发生这种情况,以及如何解决吗?谢谢

【问题讨论】:

    标签: ios titanium-mobile titanium-alloy ortc


    【解决方案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,从而将它们从应用程序内存中删除。

    【讨论】:

      猜你喜欢
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-29
      相关资源
      最近更新 更多