Sdílet prostřednictvím


Slabé odkazy

Systém uvolňování paměti nemůže shromáždit objekt, který aplikace používá, zatímco kód aplikace může tento objekt dosáhnout. Aplikace má silné odkazy na objekt.

Slabý odkaz umožňuje systému uvolňování paměti shromáždit objekt, zatímco stále umožňuje aplikaci přístup k objektu. Slabý odkaz je platný pouze během neurčité doby, dokud se objekt neshromáždí, pokud neexistují žádné silné odkazy. Při použití slabého odkazu může aplikace stále získat silný odkaz na objekt, který brání jeho shromažďování. Existuje však vždy riziko, že se systém uvolňování paměti nejprve dostane k objektu před opětovným obnovením silného odkazu.

Slabé odkazy jsou užitečné pro objekty, které používají hodně paměti, ale je možné je snadno vytvořit znovu, pokud jsou uvolněny uvolňováním paměti.

Předpokládejme, že stromové zobrazení v aplikaci model Windows Forms uživateli zobrazuje složitou hierarchickou volbu možností. Pokud jsou podkladová data velká, udržování stromu v paměti je neefektivní, když je uživatel zapojen do něčeho jiného v aplikaci.

Když uživatel přepne jinou část aplikace, můžete pomocí WeakReference třídy vytvořit slabý odkaz na strom a zničit všechny silné odkazy. Když uživatel přepne zpět na strom, aplikace se pokusí získat silný odkaz na strom a v případě úspěchu se zabrání rekonstrukci stromu.

Chcete-li vytvořit slabý odkaz s objektem, vytvoříte WeakReference pomocí instance objektu, který se má sledovat. Příklad kódu najdete WeakReference v knihovně tříd.

Krátké a dlouhé slabé odkazy

Můžete vytvořit krátký slabý odkaz nebo dlouhý slabý odkaz:

  • Krátké

    Cílem krátkého slabého odkazu se stane null , když je objekt uvolněn uvolňováním paměti. Slabý odkaz je sám o sobě spravovaný objekt a podléhá uvolňování paměti stejně jako jakýkoli jiný spravovaný objekt. Krátký slabý odkaz je konstruktor bez parametrů pro WeakReference.

  • Dlouhé celé číslo

    Dlouhý slabý odkaz je zachován po zavolání metody objektu Finalize . To umožňuje opětovné vytvoření objektu, ale stav objektu zůstává nepředvídatelný. Chcete-li použít dlouhý odkaz, zadejte true v konstruktoru WeakReference .

    Pokud typ objektu nemá metodu Finalize , použije se krátká slabá referenční funkce a slabý odkaz je platný pouze do doby, než se cíl shromažďuje, což může nastat kdykoli po spuštění finalizátoru.

Chcete-li vytvořit silný odkaz a znovu použít objekt, přetypujte Target vlastnost WeakReference na typ objektu. Pokud se Target vlastnost vrátí null, objekt byl shromážděn; jinak můžete objekt nadále používat, protože aplikace znovu získala silný odkaz na něj.

Pokyny pro používání slabých odkazů

Po dokončení používejte dlouhé slabé odkazy pouze v případě, že je stav objektu nepředvídatelný.

Nepoužívejte slabé odkazy na malé objekty, protože samotný ukazatel může být velký nebo větší.

Nepoužívejte slabé odkazy jako automatické řešení problémů se správou paměti. Místo toho vytvořte efektivní zásady ukládání do mezipaměti pro zpracování objektů vaší aplikace.

Viz také