什么是强引用?
Object obj = new Object(); 这就是一个强引用,内存分配一份空间用以存储Object数据。当一个对象被强引用的形式创建的时候,本身引用的次数为1.
接着Object o = obj.执行之后Object的引用次数为2.所以强引用会导致被引用的对象的引用次数加1.
什么是弱引用?
弱引用可以保持该对象的引用,但是不增加对象的引用次数。这样GC就能在必要时候释放对象,回收内存。
对于那些创建便宜但耗费大量内存的对象,希望保持该对象的引用,又要在应用程序中使用,同时希望GC回收,可以考虑使用弱引用。
弱引用分为短弱引用和长弱引用,默认使用的是短弱引用。
Short Weak Reference(短弱引用):一旦对象被垃圾回收,引用就会设置为null,上文所举的例子都是短弱引用。
Long Weak Reference(长弱引用):如果对象存在一个finalizer(终结器/析构函数) 并且引用被以正确的方式创建。那么引用将一直指向对象,直到finalizer结束。
使用时机:
对象相对较大,易于创建,生命周期高度可变。
使用方法:
public void ST()
{
List<int> t = new List<int>(){1, 2, 3};
StartCoroutine(Func(t));
}
public IEnumerator Func(List<int> t)
{
WeakReference<List<int>> tweak = new WeakReference<List<int>>(new List<int>(t));
yield return new WaitForSeconds(0.1f);
if (tweak.TryGetTarget(out var list))
{
UnityEngine.Debug.Log("this is not null");
}
else
{
UnityEngine.Debug.Log("this is null");
}
}
使用弱引用,结果this is null.
如果使用强引用,局部变量t在函数结束的时候还存在强引用,协程中还能获取到数组。