monsieurlemouche
Messages postés102Date d'inscriptionlundi 29 décembre 2003StatutMembreDernière intervention28 juin 2007
-
31 janv. 2007 à 01:17
monsieurlemouche
Messages postés102Date d'inscriptionlundi 29 décembre 2003StatutMembreDernière intervention28 juin 2007
-
31 janv. 2007 à 14:05
bonjour,
j'ai besoin que quelqu'un confirme mon idée.
je créée un objet collection de nom "Employes"
les objets de la collection sont des objets nommés "employe"
à chaque objet de la collection, je définis une propriété parent contenant une référence à l'objet "Employes"
je detruis la collection: set Employes=nothing
je ne peux plus accéder aux objets de la collection "employe" bien qu'ils existent encore ?
Vrai ?
deuxième question: les objets non détruits restent-ils en mémoire après fermeture de l'application? y a-t-il un risque de baisse des performances du système (fuite de memoire) ?
cs_casy
Messages postés7741Date d'inscriptionmercredi 1 septembre 2004StatutMembreDernière intervention24 septembre 201440 31 janv. 2007 à 12:00
Ne pas confondre Collection et Objets dans la Collection.
Une collection ne fait que rassembler des références vers des objets existant indépendament d'elle. En aucun cas elle ne contient les objets eux-même.
Comparons tout ça à un livre. Tes objets seraient les pages du livre, la collection serait la table des matières.
La table des atières ne contient pas les pages du livre, elle ne contient que des références vers les pages. De detruire la table des matière, ne détruit pas les pages elles-mêmes. De même, de détruire une page, ne détruit pas la référence vers cette page dans la table des matières, référence désormais érronée uisque la page n'existe plus.
Le fonctionnement est le même pour les collections.
---- Sevyc64 (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #
monsieurlemouche
Messages postés102Date d'inscriptionlundi 29 décembre 2003StatutMembreDernière intervention28 juin 2007 31 janv. 2007 à 01:30
suite de mon questionnement.
y a un truc que je ne pige pas!
vb ne détruit pas l'objet tant qu'il existe au moins une référence pointant vers celui-ci. Donc, en faisant set Employes=nothing, je ne détruis pas l'objet car les objets de la collections (objets enfants si on veut) contiennent des références pointant vers lui (le parent).
Donc, s'il n'est pas détruit, pourquoi n'est-il plus possible d'accéder aux objets de la collection.
serait-il dans un état quantique? entre le vivant et le détruit?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 31 janv. 2007 à 05:44
Tu as bien raison :
"ne détruit pas l'objet tant qu'il existe au moins une référence vers celui-ci"
- lorsque ta collection deviens hors de portée
- que le destructeur de ta collection est appelé
- ou que tu fermes ton application,
VB va libérer ta collection, et chacun des objets qui sont dedans sont détruits.
De même, en libérant tes objets, ceux-ci libèrent les objets qu'ils contenaient...
Donc aucun souci, les objets sont bien détruits ^^
monsieurlemouche
Messages postés102Date d'inscriptionlundi 29 décembre 2003StatutMembreDernière intervention28 juin 2007 31 janv. 2007 à 11:34
salut,
qu'appelles-tu destructeur de ma collection. Est-ce l'affectation set macollec=nothing?
en plaçant une méthode classe_terminate sur les objets de ma colleciton ,je me suis rendu compte des choses suivantes:
set macollec=nothing 'donc si je te suis bien, la collec et ses objets sont détruits
form unload 'je décharge la feuille
l'évènement class_terminate est invoqué pour chaque objet de la collection, donc ils n'étaient pas détruits
puisqu'un objet n'est pas détruit tant qu'il est référencé quelque part, pourquoi je ne peut plus accéder aux propriétés de ma collection après un set macollec=nothing alors qu'il y a encore des objets référencés?
je ne suis pas certain de savoir ce qu'est un destructeur (oui, d'acors, c'est une méthode qui détruit, mais comment la mettre en oeuvre)
dans le guide VB en ligne, il est préconisé de bouclé sur tous les objets d'une colelction, et sur les objets des collections des collections (en cascade) pour déférencer correctement (cela s'appelle la TearDown méthode). Cela signifie bien que set macollec=nothing ne suffit pas à détruire la collec ainsi que ses objets.
comprenez-vous mon problème de compréhension?
monsieurlémouche
Vous n’avez pas trouvé la réponse que vous recherchez ?
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 31 janv. 2007 à 12:40
tout dépend au final de la manière dont tu as remplis ta collection, à savoir la chose suivante :
les references contenues dans la collection sont elles les seules references vers tes objets ?
si oui, détruire la collection detruira la seule reference a tes objets => ils seront détruits (Class_Terminate appellé pour chacun d'eux).
si non, il faudra attendre que les autres references soient libérées... soit via un Set ... = Nothing, soit en sortant de la portée des variables (Unload, par exemple).
en clair (quoique) :
Private moSample as Object
Private moColl As Collection
Sub Test
Set moColl = New Collection
Set moSample = New xxxxxx
moColl.Add moSample
...
...
Set moColl = Nothing
End Sub
A la sortie de Test, ici, moSample contient toujours une reference de notre objet, il n'est pas détruit.
la collection a contenu le temps de la procedure une deuxieme reference vers moSample, qui a été libérée lors de l'appel à Set moColl = Nothing...