for (int i = 0; i < list.Count - 1; i++)
{
//第一段
list[i].GetComponent<Button>().onClick.AddListener(
() =>
{
OnClick(list[i + 1]);
}
);
//第二段
Button button = list[i + 1].GetComponent<Button>();
list[i].GetComponent<Button>().onClick.AddListener(
() =>
{
OnClick(button.gameObject);
}
);
}
两次碰到问题,都是下意识的写出了第一种写法,在点击触发回调时,引用到的对象都是数组的最后一个对象。原因是添加监听时,回调方法并不会立即执行,所以对应的i的值也不会立即传入,而i的所有值在内存中都是同一个地址,所以当点击触发时,i已经变成了list.count-2,所以引用的对象都是数组的最后一个对象了。
第二种写法则是传入了对应的对象,每个对象都有自己的地址,所以不会有上述问题。