Eltávolítása interfész objektumok

Eltávolítása interfész objektumok

Uraim, van egy sor interfészek és osztályok végrehajtására. A kérdés természetesen felmerül megfelelően távolítsa el ezeket az osztályokat. Ahogy értem Delphi eltávolítja őket korábban, mint én. Hogyan lehet nyomon követni.

A amelyekből kitűnik, hogy
> Delphi eltávolítja őket hamarabb, mint én ..
Van egy konkrét példát?

Delphi eltávolítja a hivatkozás a felület, amikor a referencia-száma egy objektum egyenlő 0.
Egy számláló csökken, ha a változó tartalmazó hivatkozás, hogy a felület jön ki a blokk láthatóság.

És mindez természetesen függ a kódot.
Természetesen jó példa vagy több meghatározott, amire szüksége van.

És halad egy kérdést. Én hozzátéve, hogy a felületek listáját, amelyik leírja csak egy módszer, és entot tárgy általában nem adják megfelelően eltávolítani. Ha jól értem, ha nincs kifejezett utalás, és az alkatrész láthatatlan Delphi eltávolítja nélkül perduprezhdeniya?

Kull,
ami azt jelenti, „változó. kilép a blokk láthatóság”

megérteni létrehozását és törlését, de halad a kérdés továbbra is érvényes

1. Amennyiben interfész objektumok?
2. eredménye típus - lehet ezt felület?
3.

> Ami azt jelenti, „változó. Kilép a blokk láthatóság”

példa.

var
i: IMyInterface;
kezdődik
i: = TMyInterfaceClass.Create;
.
véget; // itt ér véget a körét az I és a számláló értéke


> A csökkentést a száma, amikor a változó tartalmazó hivatkozás
> Interface jön ki a blokk láthatóságát.

És hogy mindannyian rohanó így hívják kimegy körét? Scope semmi köze hozzá.

A Delphi, minden tárgy el van látva egy interfész megvalósítása három módszer: QueryInterface, AddRef és Release. Mi érdekli AddRef és Release. Illetve, és kellett volna egy ellen - ez csak egy típusú változó értéke. Egyszerűen AddRef megnöveli a számláló 1, és Release csökkenti azt az 1., majd ha a számláló értéke 0, a tárgy törli magát. Amikor megkapod az objektum felület, nem számít, milyen módon fordul módszerrel GetInterface TObject osztály, amely visszaadja a felület, és felhívja AddRef a felületet. És meg kell jegyeznünk, hogy a Delphi Release változók, mint a felület, ha ez a változó megsemmisül.


var
it: IUnknown;
kezdődik
it: = (TInterfacedObject.Create mint IUnknown); // létrehozunk egy objektumot, kérje a felület (IUnknown), illetőleg AddRef - számolni 1.
.
.
végén; // ez - megsemmisül, de mielőtt ez az úgynevezett Release, a számláló 0 lesz - nevezzük elpusztítani.

> És amit minden olyan pret hívják elhagyja a pályát,
> Re?
Ez igaz húzza, mert ez a terület (hatály) és megy. Amelyek segítik a ugyanazt a dolgot:


Ha egy objektum hivatkozik egyetlen interfészen keresztül, nincs szükség, hogy elpusztítsa azt kézzel; Az objektum automatikusan megsemmisült, amikor az utolsó utalás megy ki a hatálya alól.
.


> Fantaszta (22.04.02 22:17)

És mi tartott ilyen sokáig, és részletesen - ugyanaz yayki, csak profilból!

Továbbá, ha a „kezeli”, hogy AddRef vagy engedje, a számláló akkor görbe (persze ha ez hanyagul).

Még bolee érdekében. Bizonyos esetekben a számláló általában nem kívánatos, például amikor a csatoló sem az alkatrészek és ellenőrzi a élettartamát a példány komponens a tulajdonos, nem pedig például a referencia száma.


> Egyáltalán nem húz, mert a hatálya alá
> (Kör), és a lövés. Amelyek segítik a ugyanazt a dolgot:

Biztos benne, hogy a hatálya alá itt a hatálya? Nem „határ” nem „context” nem „körét”?

eljárás P1;
var
it: IInterface; // amit hallottam - a hatálya alá a változó - ez egy olyan terület, ahol a szimbolikus név jelentése ugyanaz.

eljárás P2;
kezdődik
. // itt változó nem látszik. Abban az értelemben, hogy ez egy szimbolikus nevet és nem operedelenno.
végén;

Most, ezt:

eljárás P2;
kezdődik
.
dobja (IT);
végén;

Mit gondolsz, mi fog történni? Itt általában a legtöbb típusú változó IInterface láthatatlan sehová.

> És mi tartott ilyen sokáig, és részletesen - ugyanaz yayki,
> Csak profilját!

Ez így van, de ha nem használ TInterfacedObject (vagy saját végrehajtását), mint az előd, akkor nincs probléma egyáltalán az a tény, hogy a „Delphi eltávolítja az objektum hamarabb, mint” nem, amint azt a kérdést.


> Ha egy objektum hivatkozik csak interfészeket
> Nem kell, hogy elpusztítsa azt kézzel; az objektum automatikusan
> Megsemmisült, amikor az utolsó utalás megy ki a hatálya alól.
>.

Heh. Szükséges volt, hogy először olvassa el ezt, mielőtt vitatkozni (Gondolom)

Sem a hatálya változók szó.

Az Úr, és ha nem használja típusú változók
var
# 032; Ptr: TSomeInterface;
akkor hol elegendő láthatóságot
És mégis, ha létrehozunk egy objektumot, vagy hogyan kell leírni „fantaszta”
„(TInterfacedObject.Create mint IUnknown)”, hanem egyszerűen, mint egy tárgy, az AddRef felület, amely azt írja le, nem működik. És még ha néhány intrerfeysov.

végén; // INTF levelek, Release hívás count = 0 és az úgynevezett TMyObject.Free

Mint látható, a használata változók, mint a felület (belülről - egy pointer), vezet az automatikus követési linkeket. Abban az esetben, a felület, mint egy mutató, mely nem történik meg. Abban az esetben, több interface a helyzet nem változott, az egyik pult, és azáltal, hogy megváltoztatja bármilyen felületen. Az objektum megszűnik, ha nincs utalás az összes interfész


> Nincs körének változók szó.

Segélyhívásai toborozni szó köre:
- „És az vesse rá először a követ engem, akik azt mondják, hogy ez - egy lány”

Ha ez nem Oblas láthatóságát vagy művelet azonosítóját (Call legalább mi az értelme nem változik), mi ez akkor?


eljárás P1;
var
it: IInterface; // amit hallottam - a hatálya alá a változó - ez egy olyan terület, ahol a szimbolikus név jelentése ugyanaz.

eljárás P2;
kezdődik
. // itt változó nem látszik. Abban az értelemben, hogy ez egy szimbolikus nevet és nem operedelenno.
végén;

eljárás P1;
var
it: IInterface;

Nos, nem a hatálya alá. Nevezzük, amit akar értelmében nem változik.

a fantaszta:
Nos, a legtöbb körét.

> Nincs körének változók szó.

Automatikus referencia számlálás van kötve változókat. A fordító betétek kód véglegesítése felületen változó, mint az idő, amikor az áramlás vezérlő megy ki esik e változó - a kilépés az eljárásból, ha azt állapítja meg, illetőleg amely már átment az a paraméter, valamint a destruktor az osztály, amelyben a változó nyilvánították tagja az osztály .

> Lord, és ha nem használja a változókat
Ha nem kérte a felület alatt a tárgy, a referencia száma nem működik, és nem befolyásolja a működését. Ha egy helyen egy példányát a szokásos módon, és a többi kérés azt interfészek, akkor sem kell felülírja a mechanizmus referencia számolás, vagy az első eset, hogy egy másik felületen referencia - csak azért, hogy ellenőrizzék a előfordulás az élet.

> És még ha néhány intrerfeysov.
Körülbelül száma megvalósított interfészek, vagy mi? Ha ez a szám, ez nem befolyásolja a referencia száma. Befolyásolta only interface kéréseket.

2Fantasist
> Ez így van, de ha nem használ TInterfacedObject (vagy
> Saját végrehajtását), mint az előd, akkor általában nincs
> Problémák a tény, hogy a „Delphi eltávolítja az objektum hamarabb, mint” nem
> Will, amint azt a kérdést.

Ez igaz, de az is lehet a helyzet, hogy
„Delphi akarja távolítani a tárgyat később, mint én”

eljárás Proc;
var INTF: IMyInterface;
obj: TMyObject;
kezdődik
obj: = TMyObject.Create;
obj.GetInterface (IMyInterface, INTF);
obj.Free;

// automatikusan úgynevezett inft.Release;
// akkor is, ha nem csinál semmit (egyszerűen visszaadja -1) még mindig van egy AV
// mivel nevezte a vtable tárgy, amely már nem létezik.
végén;

Lehet, hogy tévedek, de a Release () nevezik így, amikor rendel nulla mutató (ha objektumra mutat). Ez volt akkor, és lehet fogni kirakodás alkatrész


> Mint látható, a használata olyan változók, mint interfész (belső
> - a pointer), ez vezet az automatikus követés
> Link.

Éppen ezért, amikor akarok sve tartani a saját ellenőrzése alá, ahelyett, hogy a felület osztályok. Írja az alábbiak szerint:


TInterface = osztály
QueryInterface (ID: TGUID; out Obj); virtuális;
AddRef; virtuális;
engedje; virtuális;
végén;

A munka nem különbözik dolgozik a felületen. Lehet, hogy nem mindig kényelmes és nem mindig szükséges, de megszünteti a tolakodó Delphi, ami nem mindig az út.

Igen, ez a mutató, és ezért nem szeretem nevezni „referencia”, mert nem mindig ugyanaz. Ismét nem értek egyet ezzel a mondattal: „A változó kimegy körét, a fordító felhívja a kiadás.” Mert „hatálya változó” kifejezés véleményem nem olyan terület, ahol megtartja értékét (amit valószínűleg nézet).

Természetesen nem változik. Csak ha nazavesh paravoz parahod, a másik nem tudja megmondani, ha nem látja a különbséget parahod és Paravozov, akár most jutott játszani a szavakkal.

Fantaszta (24.04.02 02:42)
Természetesen nem változik. Csak ha nazavesh paravoz parahod, a másik nem tudja megmondani, ha nem látja a különbséget parahod és Paravozov, akár most jutott játszani a szavakkal.

Igen, amit ragadt az ember. „Scope” és a „hatály” egy és ugyanaz (hatály angolul van már rendesen észre). És értelmében ezeket a fogalmakat a beágyazott ugyanaz. Között a C-Schnick így nem tudom használni „körét”, és soha nem hallott. Mindig mondják, hogy „körét”, és hogy ez körében elfogadott Delfistov te jobban tudod :). Szóval vajon a személy parahod mondta :)

Memória: 0.8 MB
Idő: 0.036 c

Kapcsolódó cikkek