Вы пытаетесь отслеживать, кто ссылается на объект, чтобы вы могли очистить эти ссылки, когда объект был уничтожен, или вы пытаетесь отслеживать, когда можно безопасно уничтожить объект?
Если последнее, то похоже, что вы ищете сборщик мусора. Я никогда не имел дело с Delphi, поэтому я не знаю, есть ли GC для этого, который вы можете использовать, но я был бы удивлен, если бы не было.
Если бывший, то GC, вероятно, не поможет. Если Delphi поддерживает ООП/Наследование (честно, я не знаю, если это делает), вы могли бы сделать что-то вроде этого (псевдокод):
// 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);
}
}
}
В основном, всякий раз, когда вы добавляете один из ваших отслеживаемых объектов в коллекции этой коллекции будет зарегистрируйтесь с этим объектом. Когда объект уничтожается (я полагаю, вы вызове destroy() в деструкторе объекта), тогда объект сигнализирует об уничтожении коллекции, чтобы коллекция могла делать все, что ей нужно.
К сожалению, это не очень хорошее решение, если вы хотите использовать сборные коллекции. Вам придется писать свои собственные объекты коллекции (они могут просто обернуть встроенные, хотя). И это потребует, чтобы вы регистрировались везде, где хотите отслеживать объект. Это не то, что я считаю «счастливым» решением, хотя для небольших проектов это, вероятно, было бы не так уж плохо. Я в основном надеюсь, что эта идея поможет породить другие идеи. :)
+1 для второй идеи, подклассов TInterfacedObject (или строительство корневой класс, похожий на него) будет простой способ построить RefCount класс менеджера – mjn 2010-11-10 06:59:17