我有这个示例代码,它是不完整的,因为我不知道如何做我想要做的事情.
// This class will never be garbage collected
// It is the core to my Game Engine Loop.
public class Application
{
HybridObject obj1;
HybridObject obj2;
List<Test> tests = new List<Test>();
public Application()
{
obj1 = new HybridObject();
obj2 = obj1;
for (int i = 0; i < 1000; i++)
{
Test test = new Test();
test.obj = obj1;
tests.Add(test);
}
obj1.Delete(); // This line should Null all properties using obj1 as a value.
while (true)
{
CheckIfNull();
}
}
void CheckIfNull()
{
if (obj1 == null) Console.WriteLine("Destroyed 1");
if (obj2 == null) Console.WriteLine("Destroyed 2");
foreach (var t in tests)
{
if (t.obj == null)
{
Console.WriteLine("Destroyed From List");
}
}
}
}
public class Test
{
public HybridObject obj;
}
public class HybridObject
{
public void Delete()
{
// SET ALL REFERENCES THAT POINT TO THIS HYBRIDOBJECT TO NULL
}
}
Smaller Example
如果我们只是抽象出我的代码的乱七八糟的部分.问题可以归结为,在下面的示例中,如何将使用obj的所有内容设置为空?
HybridObject obj = new HybridObject();
List<HybridObject > objects = new List<HybridObject>();
objects.Add(obj);
objects.Add(obj);
obj = null; // If I set this all obj's in the list would be null as well.
Explanation
现在让我解释一下,我正在制作一个基本的游戏引擎.
我正在try 使用Delete方法将我创建的HyBridge Object的所有引用设置为空.当我调用obj1.Delete()时,因为我将obj1属性设置为新的HyBridge Object(),然后将所有其他属性值(如obj2)设置为obj1,所以需要将‘Application’obj1、obj2属性和所有‘Test’obj属性设置为空.
当我调用obj1.Delete()时,指向(Obj1)HyBridge Object的所有内容现在都应该变为空.然后,由于没有更多的引用,HyBridge Object最终可以被垃圾回收.设置obj1=NULL;不能解决这个问题,因为它不会将其他引用设置为NULL.
Obj1属性可以传递到任何地方,比如传递到另一个类属性、列表、 struct 等.那么,在不手动跟踪所有引用的情况下,我该如何处理将所有内容设置为空呢?HyBridge Object永远不会被销毁,因为仍然会有对它的强引用.
那么,如果在我的应用程序运行时,我随着时间的推移创建了数百万个对象,但没有一个对象因为它们持有的强引用而被销毁,那又如何呢?如果随着时间的推移,我在应用程序‘obj1’中创建的一个HyBridge Object被传递到数百万个其他位置,比如集合,会发生什么呢?(当然,这都是理论上的).
问题是.如何删除指向某个对象的所有引用或指针,以便对其进行垃圾回收?我甚至不确定这是否可能.
Things I have tried
-
我找到了一个使用反射的解决方案,但当考虑到HyBridge Object如何存储(如属性、集合、 struct 等)时,它变得非常复杂,然后它必须在运行时运行我创建的每个对象实例.它不是很快,所以我认为这不是一个好主意.
-
try 在HyBridge Object中创建一个对象实例属性,然后使所有内容都引用该实例属性,当我将该实例属性设置为空时,我希望指向该实例属性的所有内容都反映该更改并变为空.但我不能让它工作.