Skip to content

代理对象(回调函数)的处理

siney edited this page Mar 6, 2019 · 3 revisions

cppbinding的时候,直接使用TFunction作为回调函数来使用,例如:

void setCallback(const TFunction<void(int)>& func) {
            callback = func;
        }

        void docall() {
            callback(1024);
        }

        TFunction<void(int)> callback;

在lua中可以直接传入luafunction作为回调函数处理

f1:setCallback(function(i) print("callback from cppbinding",i) end)
f1:docall()

如果是蓝图的delegate,slua会导出delegate到lua,代理对象分为多播和单播,他们的使用基本相同,但都需要注意需要移除对应的handle,保证没有内存泄露。

多播

Add(function) 添加一个function作为代理回到函数,返回一个handler

Remove(handler) 移除对应的函数代理

Clear() 清空所有代理

单播

Bind(function) 设置一个function作为代理回到函数,返回一个handler,对应的lua变量被置空后回收内存,但在lua尚未回收时,可能导致回调任然有效。

Clear() 立刻删除代理回调

例如

local Test=import('SluaTestCase');

-- test coroutine
local co = coroutine.create( function()
    ccb = slua.createDelegate(function(p)
        print("LoadAssetClass callback in coroutine",p) 
    end)
    Test.LoadAssetClass(ccb)
    ccb = nil
end )
coroutine.resume( co )
Clone this wiki locally