Skip to content

Commit d4d9cdf

Browse files
committed
Fix eventManager memory leak
1 parent 811ca72 commit d4d9cdf

File tree

2 files changed

+42
-40
lines changed

2 files changed

+42
-40
lines changed

Diff for: cocos2d/core/event-manager/CCEventListener.js

+39-37
Original file line numberDiff line numberDiff line change
@@ -277,15 +277,16 @@ cc.EventListener.CUSTOM = 8;
277277

278278
cc._EventListenerCustom = cc.EventListener.extend({
279279
_onCustomEvent: null,
280-
ctor: function (listenerId, callback) {
280+
ctor: function (listenerId, callback, target) {
281281
this._onCustomEvent = callback;
282-
var selfPointer = this;
283-
var listener = function (event) {
284-
if (selfPointer._onCustomEvent !== null)
285-
selfPointer._onCustomEvent(event);
286-
};
282+
this._target = target;
287283

288-
cc.EventListener.prototype.ctor.call(this, cc.EventListener.CUSTOM, listenerId, listener);
284+
cc.EventListener.prototype.ctor.call(this, cc.EventListener.CUSTOM, listenerId, this._callback);
285+
},
286+
287+
_callback: function (event) {
288+
if (this._onCustomEvent !== null)
289+
this._onCustomEvent.call(this._target, event);
289290
},
290291

291292
checkAvailable: function () {
@@ -308,31 +309,31 @@ cc._EventListenerMouse = cc.EventListener.extend({
308309
onMouseScroll: null,
309310

310311
ctor: function () {
311-
var selfPointer = this;
312-
var listener = function (event) {
313-
var eventType = cc.EventMouse;
314-
switch (event._eventType) {
315-
case eventType.DOWN:
316-
if (selfPointer.onMouseDown)
317-
selfPointer.onMouseDown(event);
318-
break;
319-
case eventType.UP:
320-
if (selfPointer.onMouseUp)
321-
selfPointer.onMouseUp(event);
322-
break;
323-
case eventType.MOVE:
324-
if (selfPointer.onMouseMove)
325-
selfPointer.onMouseMove(event);
326-
break;
327-
case eventType.SCROLL:
328-
if (selfPointer.onMouseScroll)
329-
selfPointer.onMouseScroll(event);
330-
break;
331-
default:
332-
break;
333-
}
334-
};
335-
cc.EventListener.prototype.ctor.call(this, cc.EventListener.MOUSE, cc._EventListenerMouse.LISTENER_ID, listener);
312+
cc.EventListener.prototype.ctor.call(this, cc.EventListener.MOUSE, cc._EventListenerMouse.LISTENER_ID, this._callback);
313+
},
314+
315+
_callback: function (event) {
316+
var eventType = cc.EventMouse;
317+
switch (event._eventType) {
318+
case eventType.DOWN:
319+
if (this.onMouseDown)
320+
this.onMouseDown(event);
321+
break;
322+
case eventType.UP:
323+
if (this.onMouseUp)
324+
this.onMouseUp(event);
325+
break;
326+
case eventType.MOVE:
327+
if (this.onMouseMove)
328+
this.onMouseMove(event);
329+
break;
330+
case eventType.SCROLL:
331+
if (this.onMouseScroll)
332+
this.onMouseScroll(event);
333+
break;
334+
default:
335+
break;
336+
}
336337
},
337338

338339
clone: function () {
@@ -501,11 +502,12 @@ cc._EventListenerFocus = cc.EventListener.extend({
501502
},
502503
onFocusChanged: null,
503504
ctor: function(){
504-
var listener = function(event){
505-
if(this.onFocusChanged)
506-
this.onFocusChanged(event._widgetLoseFocus, event._widgetGetFocus);
507-
};
508-
cc.EventListener.prototype.ctor.call(this, cc.EventListener.FOCUS, cc._EventListenerFocus.LISTENER_ID, listener);
505+
cc.EventListener.prototype.ctor.call(this, cc.EventListener.FOCUS, cc._EventListenerFocus.LISTENER_ID, this._callback);
506+
},
507+
_callback: function (event) {
508+
if (this.onFocusChanged) {
509+
this.onFocusChanged(event._widgetLoseFocus, event._widgetGetFocus);
510+
}
509511
}
510512
});
511513

Diff for: cocos2d/core/event-manager/CCEventManager.js

+3-3
Original file line numberDiff line numberDiff line change
@@ -258,8 +258,8 @@ cc.eventManager = /** @lends cc.eventManager# */{
258258

259259
if (!this._inDispatch) {
260260
listeners.clear();
261-
delete this._listenersMap[listenerID];
262261
}
262+
delete this._listenersMap[listenerID];
263263
}
264264

265265
var locToAddedListeners = this._toAddedListeners, listener;
@@ -751,8 +751,8 @@ cc.eventManager = /** @lends cc.eventManager# */{
751751
* @param {function} callback
752752
* @return {cc.EventListener} the generated event. Needed in order to remove the event from the dispatcher
753753
*/
754-
addCustomListener: function (eventName, callback) {
755-
var listener = new cc._EventListenerCustom(eventName, callback);
754+
addCustomListener: function (eventName, callback, target) {
755+
var listener = new cc._EventListenerCustom(eventName, callback, target);
756756
this.addListener(listener, 1);
757757
return listener;
758758
},

0 commit comments

Comments
 (0)