我有一个对象,只想在某个事件上销毁它。如何在XNA中调用析构函数?
null
,垃圾收集器将在下一次运行时回收它。IDisposable
和Dispose()
处理不再需要的对象。特别是在使用非托管资源时,使用Dispose()
声明了意图。GC.SuppressFinalize
的资源,以获得如何实现IDisposable
的好例子。
http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx
将此对象的引用设置为null
。
将对象设置为null
后,如果您希望出于某种原因立即收集该对象,请调用GC.Collect()
。
GC.Collect
的解释:_"强制立即回收所有代的垃圾。"_ 当然,是否应该调用 GC.Collect
取决于具体情况。例如,如果一个对象消耗了大量需要尽快释放的内存,那么使用 GC.Collect
是有帮助的。 - CentroIDisposable
(并在使用后使用using
或调用Dispose()
)。如果您正在处理清理工作,您需要调用GC.SuppressFinalize()
。通常情况下,您会在IDisposable
类中使用GC.SuppressFinalize()
。请参阅此代码示例以了解IDisposable
的常见用法:
http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx
如果你真的需要立即进行垃圾回收:
var myObj = new MyObject();
// This object will be cleaned up by the Dispose method.
// Therefore, you should call GC.SupressFinalize to
// take this object off the finalization queue
// and prevent finalization code for this object
// from executing a second time.
GC.SuppressFinalize(myObj);
但是我要提醒你,你应该让对象超出范围,并让GC自然地收集对象。只要你不试图做它的工作,.NET运行时非常有效地管理内存。
编辑
在查看评论后,我发现你忘记了一个重要的信息,即你正在将问题对象绑定到其他对象的方法中。这意味着你尝试完成的对象不会完成,直到用于观察事件的方法完成,从而在内存中保留大量额外的对象。
为了打破这个强引用,你可以使用一个叫做WeakReference
的对象。或者使用lambda表达式来打破强引用。
参见这个使用WeakReference的示例http://msdn.microsoft.com/en-us/library/system.weakreference.aspx
或者你可以像这样做:
dym.cas += (x, y, z) => gameTime.ElapsedGameTime(x,y,z);
替代
dym.cas += gameTime.ElapsedGameTime;
null
并推荐使用pool
是你最不想做的事情?@Nasgharet - 有什么问题吗?另外,smokeList
听起来像是一个粒子系统。如果是这种情况,你应该对所有对象使用池而不是null
。 - keyboardPgameTime
对象被释放之前永远不会释放dym
对象,因为事件处理程序创建了强引用。这是事件驱动模型常见的问题,所以即使你设置为null
,它也不会在gameTime
被释放之前被释放。 - Nick Berardi