2008-08-20 5 views

cevap

3

Diğer değişikliklerden haberdar etmek isterseniz, "Observer Pattern"'u uygulamalısınız. Delphi zaten TComponent torunları için bunu yaptı. TComponent.FreeNotification yöntemini çağırabilir ve diğer bileşen yok olduğunda nesneyiniz bildirilebilir. Bildirim yöntemini çağırarak yapar. TComponent.RemoveFreeNotification'ı çağırarak bildirim listesinden kendinizi kaldırabilirsiniz. Ayrıca bkz. this page.

Çoğu Çöp Toplayıcısı, başvuruların bir listesini almanıza izin vermez, bu nedenle bu durumda yardımcı olmazlar.Arayüzler kullanırsanız Delphi referans sayımı yapabilir, ancak yine referansları kendiniz izlemeniz gerekir.

1

Bunu neden yapmak istediğinizi tam olarak anlayamıyorum. Elbette kullanmadan önce Nil’de değil referansı mı kontrol edeceksin?

Anwyays, ben dikkate alacağını iki olası çözümler şunlardır:

  1. nesneleri yöneticisi kendi referans sayıları var.
  2. Bir referans sayma yöneticisi sınıfı oluşturun.

Muhtemelen AddRef() ve ReleaseRef() işlevlerini, yönetici veya referans olarak bilinen sınıfa eklerim. Daha sonra herhangi bir noktada kaç referansın mevcut olduğunu kontrol etmek için bunları kullanabilirsiniz. COM böyle yapar.

Referansla ilgili sınıf, yalnızca kendi referans sayısını yönetirdi. Yönetici, sayıları saymak için işaretçileri ilişkilendirmek üzere bir Harita kullanabilir.

+0

+1, TInterfacedObject sınıflara (veya ona benzer bir kök sınıf bina) bir refcount inşa etmek için basit bir yol olacağını yönetici sınıfı – mjn

0

Nesneye başvuruda bulunanları takip etmeye mi çalışıyorsunuz, böylece nesne yok edildiğinde bu referansları temizleyebilir veya nesneyi yok etmenin güvenli olduğu zamanı takip etmeye mi çalışıyorsunuz? İkincisi o zaman bir çöp toplayıcı arıyormuş gibi geliyorsa. Delphi ile hiç ilgilenmedim, o yüzden kullanabileceğin GC'ler olup olmadığını bilmiyorum, ama olmasaydım şaşırırdım. Eğer eski bir GC ise muhtemelen yardımcı olmazsa. Delphi OOP/kalıtım (bu olursa dürüst bilmiyorum) destekliyorsa, bu (pseudocode) gibi bir şey yapabileceğini:

// Anything that will use one of your tracked objects implements this interface 
interface ITrackedObjectUser { 
    public void objectDestroyed(TrackedObject o); 
} 

// All objects you want to track extends this class 
class TrackedObject { 
    private List<ITrackedObjectUser> users; 

    public void registerRef(ITrackedObjectUser u) { 
    users.add(u); 
    } 

    public void destroy() { 
    foreach(ITrackedObjectUser u in users) { 
     u.objectDestroyed(this); 
    } 
    } 
} 

Temel olarak, bu toplama olur bir koleksiyona izlenen nesnelerden birini eklediğinizde kendisini bu nesneye kaydedin. Nesne yok edildiğinde (nesnenin yıkıcısında destroy() öğesini çağırdığınızı düşünürsünüz), nesne koleksiyonun imha edildiğini gösterir, böylece koleksiyon ne gerekiyorsa onu yapabilir.

Ne yazık ki, yerleşik koleksiyonları kullanmak istiyorsanız, bu gerçekten iyi bir çözüm değildir. Kendi koleksiyon nesnelerini yazmanız gerekecek (sadece inşa edebilecekleri şeyler yapabilirler). Ve nesneyi izlemek istediğiniz her yere kayıt olduğunuzdan emin olmanız gerekir. “Mutlu” bir çözüm olarak düşünmüyordum, küçük projeler için muhtemelen çok kötü olmazdı. Esas olarak bu fikrin diğer fikirleri ortaya çıkarmaya yardımcı olacağını umuyordum.

İlgili konular