问题描述
事件系统用的订阅发布模式,将事件进行统一管理。
界面打开,注册事件;界面关闭,解注册事件。
触发事件,想关闭两个界面,发现实际上只关闭了一个界面。
导致bug的原因
触发事件时,方法内使用的是for(int i=0; i < handlerCount; i++)
的循环来依次触发的。下面写一个简单的例子,能够更直观的了解问题。
void Start()
{
List<string> test = new List<string>();
test.Add("1111");
test.Add("2222");
test.Add("3333");
test.Add("4444");
for (int i = 0; i < test.Count; i++)
{
Debug.LogError(test[i]);
test.RemoveAt(i);
}
}
上面例子的输出结果为:
1111
3333
总的来说,就是for循环过程中,对列表元素进行了移除操作,导致列表的索引和元素错乱。
解决方法
只要将for循环倒过来就可以了:for(int i = handlerCount - 1; i >= 0; --i)
一般自己写框架的话,订阅发布模式基本都会用到,而且这个问题也有一定出现的可能(写循环的时候顺手就写上去了)。&&,以后也可能在其他的地方遇到类似的bug。这里记录一下,给自己提个醒。