關於lua閉包導致引用無法釋放內存泄露


最近項目存在嚴重的內存泄漏問題,每次切level 會增加20M無法釋放的內存,翻遍了項目用了多個工具,查詢資料等

發現項目中兩種存在內存泄露的情況

1.lua閉包的不當使用,對比包的引用要及時 釋放。

2.注冊事件未及時取消訂閱,注冊到C#的luafunction 用完一定要dispose,委托事件要對應取消訂閱或清空事件。

lua閉包寫法

function BaseCtrl:genSelfFuncCallback(fn)
    local that = self;
    return function ()
        fn(that);
    end
end

使用時需要注意,出現引用無法釋放的情況

1.將該返回值賦值給一個變量,則會導致閉包return function 一直處於引用狀態,需要將該變量重新賦值,如

local a = self:genSelfFuncCallback(self.func) --此時a引用了閉包的function 由於function有應用 function會一直存在切function內的變量會一直存在包括局部變量
a()    --執行但是 a不會釋放該引用
a = nil     --重新賦值 使a 釋放對閉包的引用這樣閉包的引用才能被GC回收

2.如果只是執行沒有引用閉包 則不會出現無法釋放 執行過后會自動回收

 

切記切記 對閉包的引用要及時釋放 否則內存泄露

另外要注意事件的訂閱和取消:https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/events/how-to-subscribe-to-and-unsubscribe-from-events

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM