2017-01-31 17 views
1

Если у меня есть простой диалог предупреждения, такие какли каждый addEventListener требует removeEventListener, чтобы предотвратить утечку памяти в Appcelerator

    var dialog = Ti.UI.createAlertDialog({ 
        cancel: 1, 
        buttonNames: ['OK'], 
        message: 'Here is message.', 
        title: 'Title' 
        }); 
        dialog.addEventListener('click', function(e){ 
        // do something 
        }); 
        dialog.show(); 
        dialog = null; 

в одном окне. Предположим, я закрываю это окно, и этому экземпляру окна не назначена какая-либо переменная. В окне должно быть собрано мусор. Будет ли «диалог» в конечном итоге освобожден во время сбора мусора или потому, что я никогда не вызываю dialog.removeEventListener, он будет навсегда жить в памяти?

ответ

5

В вашем примере вы делаете не необходимо удалить прослушиватель событий.

Чтобы предотвратить утечку памяти, единственное, что вам нужно сделать в этом случае - убедиться, что вы объявляете var dialog вместо dialog (что вы сделали хорошо). Все элементы пользовательского интерфейса в локальной области внутри окна будут удалены из памяти в тот момент, когда это окно будет закрыто. Если вы объявляете глобальные ссылки, это может вызвать проблемы с памятью.

Теперь есть случаи, когда вы ДОЛЖНЫ удалить прослушиватель событий, и это пользовательские прослушиватели событий. Добавление специальных событий специально к объекту Ti.App, а не их удаление, вызовет у вас много проблем. Обычно я не рекомендую добавлять какие-либо файлы, но если вам действительно это нужно, вы должны убедиться, что они удалены, также убедитесь, что обработчик событий является именованной функцией.

+0

хорошо сказано, я бы добавил еще одну вещь, о которой нужно знать: взгляните на имя функции: addEventListener, это не setEventListener, вызывающий addEventListener несколько раз приведет к обратному вызову события слушатель вызывается несколько раз, он не будет отменять ранее добавленный прослушиватель событий – TheFuquan

+0

(я знаком с ECMAScript и DOM, но новичком от Titanium.) Что такое «много проблем» (утечка памяти в сторону), что можно ожидать, если в этих других случаях не удалить событие _listener_? Почему важно, чтобы прослушиватель событий был функцией * named * (делает ли Titanium сериализацию функций?)? – PointedEars

+0

Помимо утечек памяти вы можете видеть странное поведение в вашем приложении, например, события, запускаемые несколько раз, если эти события обрабатывают некоторый пользовательский интерфейс, он может блокировать поток пользовательского интерфейса. - Названные функции специально предназначены для глобальных пользовательских событий, вы можете иметь анонимные функции для поддерживаемых событий, и они будут удалены, если компонент пользовательского интерфейса больше не используется или не упоминается –

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

  • Нет связанных вопросов^_^