Referencias parciales y ruptura de ciclos (C++/CX)Weak references and breaking cycles (C++/CX)

En cualquier sistema de tipos basado en el recuento de referencias, las referencias a tipos pueden formar ciclos(es decir, un objeto hace referencia a un segundo objeto, el segundo objeto hace referencia a un tercer objeto, etc.), hasta que un objeto final vuelve a hacer referencia al primer objeto.In any type system that's based on reference-counting, references to types can form cycles—that is, one object refers to a second object, the second object refers to a third object, and so on until some final object refers back to the first object. En un ciclo, los objetos no se pueden eliminar correctamente cuando el recuento de referencias de un objeto se convierte en cero.In a cycle, objects can't be deleted correctly when one object's reference count becomes zero. Para ayudarle a resolver este problema, C++/CX proporciona la clase Platform:: WeakReference Class .To help you solve this problem, C++/CX provides the Platform::WeakReference Class class. Un objeto WeakReference admite el método Resolve , que devuelve null si el objeto ya no existe o produce una excepción Platform::InvalidCastException si el objeto está activo pero no es de tipo T.A WeakReference object supports the Resolve method, which returns null if the object no longer exists, or throws an Platform::InvalidCastException if the object is alive but is not of type T.

Un escenario en el que se WeakReference debe usar es cuando el this puntero se captura en una expresión lambda que se utiliza para definir un controlador de eventos.One scenario in which WeakReference must be used is when the this pointer is captured in a lambda expression that's used to define an event handler. Te recomendamos que utilices métodos con nombre cuando definas controladores de eventos, pero si deseas utilizar una expresión lambda para tu controlador de eventos (o si tienes que interrumpir un ciclo de recuento de referencias en alguna otra situación), utiliza WeakReference.We recommend that you use named methods when you define event handlers, but if you want to use a lambda for your event handler—or if you have to break a reference counting cycle in some other situation—use WeakReference. Este es un ejemplo:Here's an example:


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();
       }
    });
}

}

Cuando un controlador de eventos produce una excepción DisconnectedException, hace que el evento quite el controlador de la lista de suscriptores.When an event handler throws DisconnectedException, it causes the event to remove the handler from the subscriber list.