Delen via


Zwakke verwijzingen en breukcycli (C++/CX)

In elk typesysteem dat is gebaseerd op verwijzingstellingen, kunnen verwijzingen naar typen cycli vormen, dat wil gezegd: één object verwijst naar een tweede object, het tweede object verwijst naar een derde object, enzovoort totdat een definitief object naar het eerste object verwijst. In een cyclus kunnen objecten niet correct worden verwijderd wanneer het aantal verwijzingen van één object nul wordt. Om u te helpen dit probleem op te lossen, biedt C++/CX de klasse Platform::WeakReference. Een WeakReference object ondersteunt de methode Resolve , die null retourneert als het object niet meer bestaat of een Platform::InvalidCastException genereert als het object actief is, maar niet van het type Tis.

Een scenario waarin WeakReference moet worden gebruikt, is wanneer de this aanwijzer wordt vastgelegd in een lambda-expressie die wordt gebruikt voor het definiëren van een gebeurtenis-handler. U wordt aangeraden benoemde methoden te gebruiken wanneer u gebeurtenis-handlers definieert, maar als u een lambda wilt gebruiken voor uw gebeurtenis-handler, of als u een referentietellingscyclus in een andere situatie moet verbreken, gebruikt WeakReferenceu . Hier is een voorbeeld:

using namespace Platform::Details;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Controls;

Class1::Class1()
{
    // Class1 has a reference to m_Page
    m_Page = ref new Page();

    // m_Page will have a reference to this Class1
    // so create a weak reference to this
    WeakReference wr(this);
    m_Page->DoubleTapped += ref new DoubleTappedEventHandler(
        [wr](Object^ sender, DoubleTappedRoutedEventArgs^ args)
    {
       // Use the weak reference to get the object
       Class1^ c = wr.Resolve<Class1>();
       if (c != nullptr)
       {
           c->m_eventFired = true;
       }
       else
       {
           // Inform the event that this handler should be removed
           // from the subscriber list
           throw ref new DisconnectedException();
       }
    });
}

}

Wanneer een gebeurtenis-handler wordt gegenereerd DisconnectedException, wordt de gebeurtenis verwijderd uit de lijst met abonnees.