Share via


Zayıf Başvurular ve Döngüleri Kesme (C++/CX)

Başvuru sayımını temel alan herhangi bir tür sisteminde, tür başvuruları döngüler oluşturabilir; yani bir nesne ikinci nesneye, ikinci nesne üçüncü bir nesneye başvurur ve son bir nesne ilk nesneye geri başvurana kadar böyle devam eder. Bir döngüde, bir nesnenin başvuru sayısı sıfır olduğunda nesneler doğru şekilde silinemez. C++/CX, bu sorunu çözmenize yardımcı olmak için Platform::WeakReference Sınıfını sağlar. Nesne WeakReference artık mevcut değilse null döndüren veya nesne etkinse ancak türünde Tdeğilse platform::InvalidCastException oluşturan Resolve yöntemini destekler.

kullanılması gereken senaryolardan WeakReference biri, işaretçinin this bir olay işleyicisi tanımlamak için kullanılan lambda ifadesinde yakalanmasıdır. Olay işleyicileri tanımlarken adlandırılmış yöntemler kullanmanızı öneririz, ancak olay işleyiciniz için bir lambda kullanmak istiyorsanız veya başka bir durumda başvuru sayım döngüsünü kesmeniz gerekiyorsa kullanın WeakReference. Bir örnek aşağıda verilmiştir:

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

}

Bir olay işleyicisi oluştururken DisconnectedException, olayın işleyiciyi abone listesinden kaldırmasına neden olur.