[Laszlo-dev] LzNode, LzView, LzSprite and destroy
André Bargull
a.bargull at intensis.de
Mon Oct 29 15:56:52 PDT 2007
Currently, I'm looking at 'LPP-4879 - Memory leak in
"LzUtils.callback"', and I'm a bit concerned about how "destroy" (for
LzNode, LzView, LzSprite) should work, how it actually worked in OL3.3.x
days and what happens right now in OL4.x.
Short summary for OL3.3.x:
LzNode#destroy(..):
- setting internal flag "__LZdeleted"
- send "ondestroy" event
- ... (next steps skipped)
- recursively invoking destroy on all subnodes
- removing "name", "id"
- removing delegates, events, handlers
- removing itself from immediateparent's subnodes array
- delete "data"
LzView#destroy(..):
- ... (first steps skipped)
- removing itself from immediateparent's subviews array
- clean up "updatePlayDel" and "doQueuedDel"
- invoke "super.destroy(..)"
- return, in case of recursion
- remove "carefully" MovieClip(s) with "__LZFinishDestroyOnIdle"
- hide view [setVisible(false)]
- ... and send "onremovesubview" event
---
Things get a bit more complicated for OL4.x:
LzNode#destroy(..):
- setting internal flag "__LZdeleted"
- send "ondestroy" event
- ... (next steps skipped)
- recursively invoking destroy on all subnodes
- removing "name", "id"
- removing delegates, events
- removing itself from immediateparent's subnodes array
- delete "data"
- ...
Differences:
- step "removing handlers" has been removed
LzView#destroy(..):
- ... (first steps skipped)
- invoke "sprite.predestroy()"
- removing itself from immediateparent's subviews array
- invoke "super.destroy(..)"
- return, in case of recursion
- invoke "sprite.destroy()"
- hide view [setVisibility('hidden')]
- ... and send "onremovesubview" event
Differences:
- added step: invoke "sprite.predestroy()"
- removed step: clean up "updatePlayDel" and "doQueuedDel"
- added step: invoke "sprite.destroy()"
- removed step: remove "carefully" MovieClip(s) with
"__LZFinishDestroyOnIdle"
Notes:
- invokes "sprite.destroy(..)" always with false as the argument(!)
--> this is a bug, must be true instead of false
LzSprite#destroy (dhtml):
- checking internal flag "destroyed"
- recursively invoking destroy on all __children, if argument
"recursive" is true (will never happen see above)
- destroy __ImgPool
- remove js-events and various html-elements
- ... and setting internal flag "destroyed"
LzSprite#destroy (swf):
- recursively invoking destroy on all sprites of the subviews of its
owner, if argument "recursive" is true (will never happen see above)
--> wait a min', on all subviews of its owner? so that'd be an
empty subviews array, reason: see [step 3] of LzView#destroy(..)
--> that's just another bug
- clean up "updatePlayDel" and "doQueuedDel"
- remove MovieClip(s) with "__LZFinishDestroyOnIdle"
---
If anybody could follow me up to here: I'm just curious to know, how to
solve these two bugs.
I'd say, we need to call "this.sprite.destroy(true)" in
LzView#destroy(..), that's somehow obvious.
But the LzSprite(swf)-subview issue is a bit more complicated:
To match OL3.3.x behaviour, we could simply move 'clean up
"updatePlayDel" and "doQueuedDel"' to "LzSprite#predestroy(..)" and
remove this "recursively destroy sprites of owner's subviews"-stuff
completely, so that LzSprite#destroy(..) will only call
"__LZFinishDestroyOnIdle".
BUT, do we need to remove properly ~all~ MovieClips to avoid
memory-leaks or whatsoever? However, we didn't do this in OL3.3.x...!?
And a last question:
Why don't we remove all handlers in LzNode#destroy(..) anymore?
- André
More information about the Laszlo-dev
mailing list