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 T
değ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.
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin