Eliminarea obiectelor de interfață

Eliminarea obiectelor de interfață

domnilor, există un set de interfețe și clase care le implementează. În mod firesc, se pune problema îndepărtării corecte a acestor clase. După cum înțeleg, Delphi le elimină mai devreme decât mine. Cum poate fi urmărită.







Și din care se poate vedea acest lucru
> Delphia le îndepărtează înainte de a mă ..
Există un exemplu concret?

Delphi șterge referința la interfață când numărul de referință al obiectului devine 0.
A reduce contorul atunci când variabila care conține referința la interfață iese din blocul de vizibilitate.

Și totul depinde, desigur, de cod.
Firește, ar fi frumos să ai un exemplu sau mai exact despre ceea ce ai nevoie.

Și o altă întrebare care trece. Mai adaug încă o dată în lista de interfețe, care descrie doar o singură metodă, iar acest obiect nu este permis să fie șters deloc. Cum înțeleg atunci când nu există o referință explicită la aceasta și componenta este invizibilă pentru dolphy o înlătură fără să se facă tam-tam?

Kull,
ceea ce înseamnă că "variabila iese din blocul de vizibilitate"

Odată cu crearea și îndepărtarea înțeleasă, o întrebare trecătoare rămâne în vigoare

1. Și unde sunt obiectele de interfață?
2. Ce fel de rezultat - poate această interfață?
3.

> ceea ce înseamnă că "variabila iese din blocul de vizibilitate"

de exemplu.

var
i: IMyInterface;
începe
i: = TMyInterfaceClass.Create;
.
end; // aici domeniul de aplicare pentru i se termină și contorul scade


> A reduce contorul atunci când variabila conține referința la
> interfața iese din blocul de vizibilitate.

Și ce-o mai numiți așa de mult ca o ieșire din câmpul de vizibilitate? Domeniul de aplicare nu este deloc.

În Delphi, toate obiectele echipate cu interfața implementează trei metode: QueryInterface, AddRef și Release. Suntem interesați de AddRef și Release. În consecință, trebuie să existe un contra - este doar o variabilă a întregului tip. AddRef incrementează pur și simplu contorul cu 1, iar Release îl reduce cu 1, iar dacă după aceea contorul este 0, atunci obiectul se autodistruge. Când obțineți interfața unui obiect, indiferent de ce fel, acesta este obținut utilizând metoda GetInterface a clasei TObject, care returnează interfața și apelează AddRef pentru această interfață. Și trebuie să țineți cont de faptul că Delphi numește Release pentru variabile de tip interfață, atunci când această variabilă este distrusă.


var
aceasta: IUnknown;
începe
it: = (TInterfacedObject.Create ca IUnknown); // obiectul este creat, interfața sa (IUnknown) este solicitată și în consecință AddRef - counter este 1.
.
.
se încheie; // acesta - este distrus, dar înainte de a fi numit Eliberare, contorul devine 0 - Distruge este chemat.

> Și că tot așa pretuiți-i o cale de ieșire din câmp
> vizibilitate?
Absolut dreapta trage, pentru că este vorba de domeniul de aplicare (domeniul de aplicare) și merge. Aici este ajutorul despre aceleași:


Atunci când un obiect este referit doar prin interfețe, nu este nevoie să îl distrugeți manual; obiectul este automat când ultima referință la acesta iese din domeniul de aplicare.
.


> Fantasist (22.04.02 22:17)

Și ceea ce ați descris atât de mult și în detaliu - aceleași ouă, numai în profil!

Mai mult decât atât: dacă "mânerele" fac AddRef sau Release, atunci curba va fi (desigur, dacă o faci inexact).

Chiar mai mult decât atât. În unele cazuri, contorul este în general nedorit, de exemplu, atunci când interfețele sunt implementate în componente și durata de viață a unui exemplu este controlată de proprietarul componentei, mai degrabă decât instanța însăși prin numărul de referință.


> Trage cu adevărat drept, pentru că este vorba despre domeniul de aplicare
> (domeniul de aplicare) este și este. Aici este ajutorul despre aceleași:

Sunteți sigur că domeniul de aplicare este domeniul de aplicare aici? Nu este "frontiera" nu "contextul", ci "obiectul"?

procedura P1;
var
it: IInterface; // ceea ce am auzit - domeniul de aplicare al acestei variabile este o zonă în care acest nume simbolic are același înțeles.

procedura P2;
începe
. // aici variabila nu este vizibilă. În sensul că numele simbolic nu este definit aici.
se încheie;

Și acum facem acest lucru:

procedura P2;
începe
.
aruncați (ea);






se încheie;

Ce crezi că se va întâmpla? Aici, în general, cea mai mare variabilă de tipul IInterface este invizibilă pentru noi oriunde.

> Și ceea ce ați descris atât de mult și în detaliu - aceleași ouă,
> numai în profil!

Așa e, dar dacă nu utilizați TInterfacedObject (sau propria implementare) ca strămoș, atunci nici o problema cu faptul că „Delphi elimină obiectul mai devreme decât mine“ nu este, după cum se menționează în întrebare.


> Atunci când un obiect este referit doar prin interfețe, există
> nu este nevoie să o distrugeți manual; obiectul este automat
> când ultima referință la aceasta nu se aplică.
>.

Heh. Mai întâi a fost necesar să citim acest lucru înainte de a ne certa (eu sunt eu)

Nu este vorba despre domeniul variabilelor.

Domnilor, și dacă nu folosesc deloc variabilele
var
# 032; Ptr: TSomeInterface;
atunci unde este factorul de vizibilitate
Și totuși, dacă creez un obiect, așa cum este descris de "fantezistul"
"(TInterfacedObject.Create as IUnknown)", dar pur și simplu ca obiect, interfața AddRef pe care o descrie nu funcționează. Și totuși, dacă există mai multe interfețe.

se încheie; // intf leaves, call Release, counter = 0 și apeluri TMyObject.Free

După cum puteți vedea, utilizarea variabilelor tipului de interfață (înăuntru - acesta este un indicator) duce la urmărirea automată a referințelor. În cazul în care lucrați cu interfața ca indicator, acest lucru nu se întâmplă. În cazul mai multor interfețe, situația nu se schimbă, contorul este unul, iar când utilizați orice interfață, acesta se schimbă. Obiectul este distrus când nu există referințe la toate interfețele sale


> Nu este vorba despre domeniul variabilelor.

Apelați Ajutor tastați domeniul de aplicare cuvânt:
- "și să arunce mai întâi o piatră la mine, care să spună că este o fată"

Dacă acest lucru nu este un câmp de vizibilitate sau acțiunea identificatorului (sunați cel puțin ce semnificație nu se va schimba), atunci ce este acesta?


procedura P1;
var
it: IInterface; // ceea ce am auzit - domeniul de aplicare al acestei variabile este o zonă în care acest nume simbolic are același înțeles.

procedura P2;
începe
. // aici variabila nu este vizibilă. În sensul că numele simbolic nu este definit aici.
se încheie;

procedura P1;
var
it: IInterface;

Ei bine, nu domeniul de aplicare. Denumire indiferent de sensul nu se va schimba.

la Fantasist:
Ei bine, da, mai degrabă domeniul de aplicare.

> Nu este vorba despre domeniul variabilelor.

Numărătoarea automată a referințelor este legată de variabile. Codul inserturi compilator interfață finalizare variabilă ca în momentul în care fluxul de control va ieși din domeniul de aplicare al acestei variabile - la ieșirea din procedura în cazul în care acesta este declarat sau care a fost transferat ca parametru precum destructorul clasei în care variabila este declarată ca membru al clasei .

> Domnilor, și dacă nu folosesc deloc variabilele
Dacă nu solicitați interfețe din obiect, numărul de referință nu funcționează și nu afectează funcționarea în nici un fel. Dacă sunteți într-un singur loc utilizând o copie în mod obișnuit, iar în cealaltă cerere interacționează, trebuie să suprascrie fie mecanismul de numărare de referință, fie în primul caz să aibă o referință suplimentară interfață - doar în scopul de a controla instanta timp de viață.

> Și totuși, dacă există mai multe interfețe.
În jurul numărului de interfețe implementate sau ce? În cazul cantității, atunci nu afectează în nici un fel numărul de referință. Influența este furnizată numai de cererile de interfață.

2Fantasist
> Așa este, dar dacă nu utilizați TInterfacedObject (sau
> propria sa implementare) ca strămoș, atunci în general nu există
> probleme cu faptul că "Delphi înlătură un obiect înainte de mine" nu
> va fi, așa cum sa menționat în întrebare.

Acest lucru este adevărat, dar poate apărea o situație în care
"Delphi va dori să șterge obiectul mai târziu decât eu"

procedura Proc;
var intf: IMyInterface;
obj: TMyObject;
începe
obj: = TMyObject.Create;
obj.GetInterface (IMyInterface, intf);
obj.Free;

// automat numit inft.Release;
// chiar daca nu face nimic (doar returneaza -1), avem inca AV
// din moment ce se numește printr-un obiect vtable, care nu mai există.
se încheie;

Poate că greșesc, dar Release () pare să fie apelat când nilul este atribuit acestui pointer (dacă indică un obiect). Aici este posibil să prindeți descărcarea componentei


> După cum puteți vedea, utilizarea variabilelor de interfață (în interiorul
> este un pointer), duce la urmărirea automată
> link-uri.

De aceea, când vreau să o țin sub control, folosesc clase în loc de interfețe. Tastați după cum urmează:


TInterface = clasă
QueryInterface (ID: TGUID; out Obj); virtuale;
AddRef; virtuale;
Release; virtuale;
se încheie;

Lucrarea nu diferă de lucrul cu interfața. Acest lucru nu este întotdeauna convenabil și nu întotdeauna necesar, dar vă permite să scăpați de ajutorul obsedant Delphi, care nu este întotdeauna calea.

Da, acesta este un indicator și din acest motiv nu-mi place să îl numesc "referință", pentru că nu este întotdeauna același lucru. Din nou, nu sunt de acord cu această expresie: "variabila este în afara domeniului de aplicare". Compilatorul solicită eliberarea "deoarece" domeniul de aplicare al variabilei "înseamnă, în opinia mea, nu zona în care își păstrează valoarea (ceea ce aparent având în vedere).

Desigur, să nu se schimbe. Pur și simplu dacă parazon parazod parazhod, restul nu poate înțelege, dacă nu vedeți diferența dintre paradă și paravozom, dacă doriți doar să jucați cu cuvintele.

Fantezist (24/04/2002 02:42)
Desigur, să nu se schimbe. Pur și simplu dacă parazon parazod parazhod, restul nu poate înțelege, dacă nu vedeți diferența dintre paradă și paravozom, dacă doriți doar să jucați cu cuvintele.

De ce ești blocat de un bărbat. "Domeniul de aplicare" și "domeniul de aplicare" sunt aceleași lucruri (domeniul în limba engleză, așa cum este deja menționat corect). Iar semnificația acestor concepte este aceeași. Printre S-shnikov în general, am folosi "domeniul de aplicare" și nu auzit niciodată. Spuneți întotdeauna "domeniul de aplicare", dar ceea ce este acceptat în rândul delfiștilor știi mai bine :). Deci nu ar fi trebuit să-i spui omului despre parade :)

Memorie: 0,8 MB
Durată: 0,036 secunde







Articole similare

Trimiteți-le prietenilor: