首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从内存中删除事件处理程序(ortc)

从内存中删除事件处理程序(ortc)
EN

Stack Overflow用户
提问于 2014-11-02 15:13:44
回答 1查看 194关注 0票数 1

我有个记忆泄露:

代码语言:javascript
复制
    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();

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-02 15:19:21

与其用内置函数定义侦听器,不如始终将它们声明为调用函数。

要删除一个eventListener,它必须在addEventListener和removeEventListener中都是相同的,将它声明为一个函数并将其分配给eventListener可以绕过这一点。例如:

代码语言:javascript
复制
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,从而从应用程序内存中删除它们。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26700805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档