You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity中onClick.Addlistener是否会引发内存泄漏?

这段Unity代码确实会引发内存泄漏

问题分析

  • Update()是Unity引擎每帧都会执行的方法,你的代码在每一次调用时都会给button.onClick添加一个全新的匿名委托
  • 这些匿名委托会被button的点击事件委托列表持续持有引用,不会被自动清理:
    • 除非你显式调用RemoveListener移除委托
    • 或者button对象被彻底销毁并回收
  • 随着游戏运行,委托列表会不断膨胀,占用的内存持续累积,最终形成内存泄漏。

修复方案

  1. 移至单次执行的生命周期方法(最常用的解决方式)
    把委托添加逻辑放到Start()或Awake()这类只执行一次的方法中,避免重复添加:

    void Start()
    {
        button.onClick.AddListener(() =>
        {
            Debug.Log("Clicked!!");
        });
    }
    
  2. 动态控制委托的添加与移除
    如果业务逻辑要求必须在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:52:05