Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

constructeur/destructeur

19 réponses
Avatar
unbewusst.sein
bon dans un script je crée de nouveaux objets par :

var a=new Ant(...);

quand a a fini son taf, je n'en ai plus besoin, pour détruire cette
objet (*) il me suffit de faire :

a=null;

ça libère de la ram ?

* peut lui-même avoir créé d'autres objets a', a'' etc... MAIS ils
finissent leur boulot avant que a finisse le sien.
--
Une Bévue

10 réponses

1 2
Avatar
unbewusst.sein
Une Bévue wrote:


a=null;


bon, ça, ça ne suffit pas.

ça n'a pas d'effet (avec FF3) sur a.

en fait, mon code lit une séquence de caractères (du genre "F+[-F...]"

à l'ouverture d'un "[" le parent cré un enfant qui se termine par "]"

l'enfant lit la même séquence, arrivé à la première fermeture (ie "]")
il est devenu inutile et même doit-être détruit, depuis le parent auquel
il retourne la main.

pour l'instant, ce qui marche le mieux, mais ne me semble pas très
élégant, et d'avancer l'enfant, depuis le parent, au bout de la chaine
de caractères.

mon code est à la page
<http://thoraval.yvon.free.fr/Canvas/l_system.xhtml>

à partir de la ligne 126, j'ai :
case ']':
this.parent.restore(this);// <= le parent "reprend la main"
this.index=this.rule.length-1;//index en bout de chaine
break;

et le #restore(object) est à partir de la ligne 71 :
this.restore=function(child){
this.penUp();
ctx.moveTo(this.x,this.y);
this.penDown();
this.index=child.index+1;
this.actRule(this.rule);
return this;
};

--
Une Bévue

Avatar
SAM
Une Bévue wrote:

a=null;


bon, ça, ça ne suffit pas.


Ben je croyais qu'une fonction quand elle avait fini son boulot libérait
la mémoire ?
(tant qu'on n'attaque pas des variables globales ...)

au pire, à mon idée, tu restes avec la dernière restauration(*), non ?
Est-ce grave ?

(*) et encore ? pas certain puisque "return this"

Ne suffit-il pas de se pencher sur le principe-problème des "closures" ?
<http://blogs.developpeur.org/cyril/archive/2007/10/16/prototype-closure-optimisation-creation-classe-javascript.aspx>
(qui sont un sujet de fuite de mémoire avec IE)
<http://laurens.vd.oever.nl/weblog/items2005/closures/>
où on a une indication du moment où il faut faire : a = null;

ça n'a pas d'effet (avec FF3) sur a.

en fait, mon code lit une séquence de caractères (du genre "F+[-F...]"

à l'ouverture d'un "[" le parent cré un enfant qui se termine par "]"

l'enfant lit la même séquence, arrivé à la première fermeture (ie "]")
il est devenu inutile et même doit-être détruit, depuis le parent auquel
il retourne la main.

pour l'instant, ce qui marche le mieux, mais ne me semble pas très
élégant, et d'avancer l'enfant, depuis le parent, au bout de la chaine
de caractères.

mon code est à la page
<http://thoraval.yvon.free.fr/Canvas/l_system.xhtml>

à partir de la ligne 126, j'ai :
case ']':
this.parent.restore(this);// <= le parent "reprend la main"
this.index=this.rule.length-1;//index en bout de chaine
break;

et le #restore(object) est à partir de la ligne 71 :
this.restore=function(child){
this.index=child.index+1;


child = null; // ???

this.penUp();
ctx.moveTo(this.x,this.y);
this.penDown();
this.actRule(this.rule);
return this;
};


object = null; // ???

--
sm


Avatar
unbewusst.sein
SAM wrote:

Ben je croyais qu'une fonction quand elle avait fini son boulot libérait
la mémoire ?
(tant qu'on n'attaque pas des variables globales ...)


"on" m'a dit (sur clj) qu'il n'y a rien de spécifié à ce sujet...

au pire, à mon idée, tu restes avec la dernière restauration(*), non ?
Est-ce grave ?


ben dans mon cas, je vois très bien dans le canvas qu'il y a un pb : ça
donne des lignes suplémentaires...

(*) et encore ? pas certain puisque "return this"


ça (ie le return this) c'est pour permettre de chainer les commandes par
ex :

turnRight().goForward().penUp()...


Ne suffit-il pas de se pencher sur le principe-problème des "closures" ?
<http://blogs.developpeur.org/cyril/archive/2007/10/16/prototype-closure-
optimisation-creation-classe-javascript.aspx>

(qui sont un sujet de fuite de mémoire avec IE)
<http://laurens.vd.oever.nl/weblog/items2005/closures/>
où on a une indication du moment où il faut faire : a = null;


je vais lire ça attentivement...



child = null; // ???


ouais, bien sûr, j'ai pensé à ça, mais ça ne change rien, la branche
reste quand même active, le seul moyen **efficace** que j'ai trouvé pour
"tuer une branche" est d'avancer son index à la fin de la chaine
"rule"...

mais bon, il faut que je retrouve ce qu'il faut faire pour détruire un
enfant devenu inutile, car, comme ce principe est récursif, on a très
vite beaucoup de segments tracés...

je viens de mettre en ligne, sur la même page
(<http://thoraval.yvon.free.fr/Canvas/l_system.xhtml>) le L-System
"Koch" plus "spectaculaire" que mon arbre style cactus...

je dois encore ajouter un angle différent de 90° et ensuite je passe à
une version 3D en VRML...

--
Une Bévue

Avatar
unbewusst.sein
SAM wrote:

Ne suffit-il pas de se pencher sur le principe-problème des "closures" ?
<http://blogs.developpeur.org/cyril/archive/2007/10/16/prototype
-closure-optimisation-creation-classe-javascript.aspx>


OK, je vais essayer par proto.

mais qq me choque : dans mon cas j'ai besoin d'initialiser l'objet en
question (ie. déplacé la "tortue"/"fourmi" à ses coordonnées initiales.

dans la version actuelle en closure, je fais ça comme ça :

function Ant(...){
[...]
var that=this;
function init(){
that.ctx.moveTo(that.x,that.y);
that.penDown();
}
init();
}

l'intérêt est que je n'ai pas à faire un init sur une instance.

mais en passant à prototype, avec :

var Foo = function(){};

je fais comme d'hab ?

càd :

j'initialise les attributs de l'objet :

function UnObjet(attribut_1,...,attribut_n){
this.attribut_1=attribut_1;
...
this.attribut_n=attribut_n;
var that=this;
function init(){...}
init();
}

puis :
UnObjet.prototype.uneFonction=function(params){...; return this;};

donc seules les functions sont "externalisées" par prototypes...

je pense que le "that" dans init() ne fabrique pas de cycle (?)

j'ai bon, ou je n'ai rien compris au film ???

--
Une Bévue

Avatar
unbewusst.sein
SAM wrote:

Ne suffit-il pas de se pencher sur le principe-problème des "closures" ?
<http://blogs.developpeur.org/cyril/archive/2007/10/16/prototype
-closure-optimisation-creation-classe-javascript.aspx>

(qui sont un sujet de fuite de mémoire avec IE)


bon j'ai suivi cette page et j'ai créé ma propre page d'essai,
pratiquement du copié/collé excepté la gestion des autres navigateurs
qu'IE7 (pas d'attachEvent) :

seule la fonction de test a été modifiée :
function test(){
var element = document.getElementById("test");
if(element.addEventListener){ // FF Saf and Co
element.addEventListener("onclick", function(){
alert("Clicked: " + this.innerHTML);
}.closure(element));// <=================== ligne 73
}else if(element.attachEvent){ //IE si je ne m'abuse...
element.attachEvent("onclick", function(){
alert("Clicked: " + this.innerHTML);
}.closure(element));
}
}


MAIS FF3RC1 couine :
Erreur : uncaught exception: [Exception... "Not enough arguments"
nsresult: "0x80570001 (NS_ERROR_XPC_NOT_ENOUGH_ARGS)" location: "JS
frame :: http://127.0.0.1/JS/closure_leak_free.xhtml :: test :: line 73"
data: no]

je n'ai pas encore pigé pourquoi ?

c'est à la page
<http://thoraval.yvon.free.fr/JS/leak_free_closures.xhtml>

au cas où tu aurais des lumières...
--
Une Bévue

Avatar
SAM
SAM wrote:

ben dans mon cas, je vois très bien dans le canvas qu'il y a un pb : ça
donne des lignes suplémentaires...


Comme, et à mon habitude, je ne comprends rien à ce que tu fabriques ...
j'ai du mal à juger le résultat :-)

(*) et encore ? pas certain puisque "return this"


ça (ie le return this) c'est pour permettre de chainer les commandes par
ex :

turnRight().goForward().penUp()...


Oui c'est ça, ça le retourne à l'autre.
à mon idée puisque l'autre l'a récupéré, l'original doit être "oublié"

je viens de mettre en ligne, sur la même page
(<http://thoraval.yvon.free.fr/Canvas/l_system.xhtml>) le L-System
"Koch" plus "spectaculaire" que mon arbre style cactus...


Je n'ai pas eu l'heure de profiter de ton "cactus"

je dois encore ajouter un angle différent de 90° et ensuite je passe à
une version 3D en VRML...


Avec application de textures et lumières j'espère !
Sinon avec des surfaces animées en SVG
(<http://thoraval.yvon.free.fr/SVG/svg_dom2.xhtml>)

Qu'utilises-tu pour voir du VRML dans un brouteur ?

--
sm


Avatar
SAM

MAIS FF3RC1 couine :
Erreur : uncaught exception: [Exception... "Not enough arguments"


Bon ... ben ... y manque au moins un argument ...

Le "useCapture" par exemple ? (true/false)

De plus ce n'est pas 'onclick' mais 'click' pour le type d'event

function test(){
var element = document.getElementById("test");
if(element.addEventListener) {
element.addEventListener("click", // type
// ^^^^^
function(){ alert('Clicked: ' + this.innerHTML);
}.closure(element), // listener
false); // usecapture
// ^^^^^
}
}

je n'ai pas encore pigé pourquoi ?


qques fôtes de frappe ?

c'est à la page
<http://thoraval.yvon.free.fr/JS/leak_free_closures.xhtml>

au cas où tu aurais des lumières...


bof ... et c'est mieux avec .closure(element) ?
Comment tu le vois (le mieux) ?

--
sm

Avatar
unbewusst.sein
SAM wrote:
Je n'ai pas eu l'heure de profiter de ton "cactus"


euh ce que j'appelle le "cactus" c'est ça :
<http://thoraval.yvon.free.fr/Canvas/l_system.xhtml>

Koch est là maintenant :
<http://thoraval.yvon.free.fr/Canvas/l_system_koch.xhtml>

les L-Systems permettent de "générer" des plantes virtuelles par
exemple.

des liens vers L-System sont sur ma page
<http://thoraval.yvon.free.fr/Canvas/l_system_links.xhtml>

des exemples d'algo sont donnés sur la page :
<http://thoraval.yvon.free.fr/Canvas/l_systems_examples.xhtml>

Avec application de textures et lumières j'espère !
Sinon avec des surfaces animées en SVG
(<http://thoraval.yvon.free.fr/SVG/svg_dom2.xhtml>)


tiens, à la page "XPath with 2 Namespaces" :
<http://thoraval.yvon.free.fr/DOM/xpath_2_namespaces.xhtml>
tu peux "compter fleurette" avec XPath ;-)

la fleur à droite, sous le menu DOM, perd des pétales si tu choisis :
"//svg:use[@id = 'outer-petals-01']" puis Remove...

Qu'utilises-tu pour voir du VRML dans un brouteur ?


Cortona VRML Client : <http://www.parallelgraphics.com/products/cortona>

mais cette beta a un ch'ti pb avec FF3C1 :
<http://cjoint.com/data/gctzWmRtwT.htm>

c'est OK avec Safari/WebKit :
<http://cjoint.com/data/gctDj0Uy4V.htm>

ça peut se mettre dans du html, un bête cylindre :
<http://thoraval.yvon.free.fr/VRML/embed_vrml.html>

tu as des liens sur tout ça à la page :
<http://thoraval.yvon.free.fr/VRML/external_links.xhtml>

j'ai aussi quelques exemples, tu peux regarder ce que j'ai dans mes
dossiers en regardant l'arborescence de mon répertoire VRML là :
<http://thoraval.yvon.free.fr/VRML/treemap.xhtml>

en général j'ai une page "treemap.xhtml" par dossier...


--
Une Bévue

Avatar
unbewusst.sein
SAM wrote:

Bon ... ben ... y manque au moins un argument ...

Le "useCapture" par exemple ? (true/false)

De plus ce n'est pas 'onclick' mais 'click' pour le type d'event


ah oui ! mea culpa, mea culpa ;-)




<snip />

je n'ai pas encore pigé pourquoi ?


qques fôtes de frappe ?


euh, j'ai copié/collé trop vite...


c'est à la page
<http://thoraval.yvon.free.fr/JS/leak_free_closures.xhtml>

au cas où tu aurais des lumières...


bof ... et c'est mieux avec .closure(element) ?
Comment tu le vois (le mieux) ?


ben, si j'ai bien compris, le pb de référence circulaire se constate
avec IE seulement... donc je n'ai pas le moyen de tester...

sinon que ça marche, comme maintenant dans mon essai renouvelé qui sera
en ligne incessamment sous peu )))

tiens dans le même ordre j'ai commencé un test avec la fonction
isMethod( object, method) proposée par Pointedears sur clj :

<http://thoraval.yvon.free.fr/JS/tests/is_method.xhtml>

les refs du post sont dans le fichier :

<http://thoraval.yvon.free.fr/JS/tests/is_method.txt>

--
Une Bévue


Avatar
SAM
SAM wrote:

Qu'utilises-tu pour voir du VRML dans un brouteur ?


Cortona VRML Client : <http://www.parallelgraphics.com/products/cortona>

mais cette beta a un ch'ti pb avec FF3C1 :
<http://cjoint.com/data/gctzWmRtwT.htm>


Je vois qu'il n'y a rien de bien nouveau.
Cortona toujours été pénible à lancer et aussi à manipuler et tout ça
dans un espace pas très grand et assez sombre.

Il y a d'autres trucs encore + propriétaires et piouz difficiles à
mettre en place dans une page web (si on est arrivé à produire le VRML
ou WRM kileurplait)

en général j'ai une page "treemap.xhtml" par dossier...


C'est super bien fait mais pourquoi ça a tant de mal à s'ouvrir ?

--
sm


1 2