Unity中onClick.Addlistener是否会引发内存泄漏?
这段Unity代码确实会引发内存泄漏
问题分析
Update()是Unity引擎每帧都会执行的方法,你的代码在每一次调用时都会给button.onClick添加一个全新的匿名委托- 这些匿名委托会被
button的点击事件委托列表持续持有引用,不会被自动清理:- 除非你显式调用
RemoveListener移除委托 - 或者
button对象被彻底销毁并回收
- 除非你显式调用
- 随着游戏运行,委托列表会不断膨胀,占用的内存持续累积,最终形成内存泄漏。
修复方案
移至单次执行的生命周期方法(最常用的解决方式)
把委托添加逻辑放到Start()或Awake()这类只执行一次的方法中,避免重复添加:void Start() { button.onClick.AddListener(() => { Debug.Log("Clicked!!"); }); }动态控制委托的添加与移除
如果业务逻辑要求必须在Update()中处理,需要先判断委托是否已存在,或者在不需要时及时移除:private System.Action _clickHandler; void Awake() { // 提前创建委托实例,避免每次生成新对象 _clickHandler = () => Debug.Log("Clicked!!"); } void Update() { // 示例:根据条件动态添加/移除委托 if (需要添加委托的条件 && !button.onClick.GetPersistentEventListeners().Contains(_clickHandler)) { button.onClick.AddListener(_clickHandler); } else if (需要移除委托的条件) { button.onClick.RemoveListener(_clickHandler); } }
内容的提问来源于stack exchange,提问作者SoulSystem
相关产品推荐
相关产品推荐

