在Unity中,WeakReference 类并不直接属于Unity引擎的一部分,而是来自C# .NET框架。WeakReference 用于创建对对象的引用,但这种引用不会阻止垃圾回收器回收该对象。这意味着如果你只通过弱引用来保持对某个对象的引用,当垃圾回收发生时,并且没有其他强引用指向这个对象,那么它可能会被回收。
使用 WeakReference 的主要作用和好处包括:
1、管理内存: 在某些情况下,你可能希望一个对象可以在不再需要时被释放,即使还有其他部分代码持有对该对象的引用。比如缓存系统,可以使用弱引用来存储对象,以便在内存压力下允许这些对象被回收。
2、避免内存泄漏: 在事件处理和其他回调机制中,如果订阅者不正确地取消订阅,可能导致内存泄漏。使用弱引用来跟踪订阅者可以帮助避免这种情况,因为这不会阻止订阅者对象被垃圾回收。
3、提高性能: 如果你有一个经常访问的对象列表,但是这些对象并不是总是需要存在的,你可以使用弱引用来保存它们。这样,当这些对象不再活跃时,它们可以被回收,从而节省内存,同时在它们确实存在的情况下,你仍然可以快速访问它们。
4、减少不必要的对象存活: 在某些场景下,如临时对象或一次性使用的对象,使用弱引用来引用这些对象可以确保它们不会因为有引用而被错误地保留更长时间。
在Unity中使用 WeakReference 或其泛型版本 WeakReference 需要注意的是,它主要用于那些生命周期不确定的对象,并且应该谨慎使用以确保你的游戏或应用能够正确管理资源和避免潜在的空引用异常。
此外,在Unity中还有一种称为 WeakEvent 模式的实现,用于解决事件处理程序中的强引用问题,但它不是直接与 WeakReference 相关,而是另一种设计模式来帮助避免内存泄漏。
public static void RunLongLiving(Action job)
{
var thread = new Thread(new ParameterizedThreadStart((param) => job()));
thread.Start();
ThreadList.Add(thread, $"Job Target = {job.Target.ToString()},Job Method = {job.Method.ToString()}");
UnityEngine.Debug.Log($"[BestHTTP]:ThreadedRunner RunLongLiving job Target = {job.Target.ToString()}, job Method = {job.Method.ToString()}");
WeakReference weakRef = new WeakReference(thread);
WeakRefList.Add(weakRef, thread.ManagedThreadId);
}
public static Dictionary<Thread, string> ThreadList = new Dictionary<Thread, string>();
public static Dictionary<WeakReference, int> WeakRefList = new Dictionary<WeakReference, int>();