(Xamarin,Android)这段代码如何帮助减少引用实例
本文关键字:实例 帮助 何帮助 引用 代码 Xamarin Android 段代码 | 更新日期: 2023-09-27 17:59:55
我正在阅读针对Android的垃圾回收文档——减少引用实例,我不太了解这个代码的机制
class HiddenReference<T> {
static Dictionary<int, T> table = new Dictionary<int, T> ();
static int idgen = 0;
int id;
public HiddenReference ()
{
lock (table) {
id = idgen ++;
}
}
~HiddenReference ()
{
lock (table) {
table.Remove (id);
}
}
public T Value {
get { lock (table) { return table [id]; } }
set { lock (table) { table [id] = value; } }
}
}
class BetterActivity : Activity {
HiddenReference<List<string>> strings = new HiddenReference<List<string>>();
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
strings.Value = new List<string> (
Enumerable.Range (0, 10000)
.Select(v => new string ('x', v % 1000)));
}
}
HiddenReference是如何工作的?如果GC将递归地扫描BetterActivity引用的实例,难道它看不到字符串字段中的列表,然后看不到列表中的所有字符串吗?我想我错过了什么。感谢您的帮助。
谢谢!
这个想法是HiddenReference
有一个static Dictionary<T>
。垃圾收集器将每个静态对象视为根对象。这意味着我们有一个托管的、有根的对象。在这种情况下,GC桥不需要检查潜在的引用,因为它可以确保对象永远不会被收集。
需要注意的一点是:如果在GC过程中看到速度减慢,那么应该减少Activity
中的引用。如果您的应用程序运行良好,则无需进行优化。