多播代理
多播代理的功能和单播代理几乎一样。区别是它们对目标为弱引用,可以和结构体一起使用,可以很方便地进行拷贝,等等。 和普通代理一样,多播代理可被载入/保存,并远程触发;但是,多播代理的函数无法使用返回值。最好将它们用于方便地传递代理集合。
事件 是特定类型的多播代理,同时具有对Broadcast()
, IsBound()
, 和 Clear()
函数的受限访问。
声明多播代理
多播代理的声明方式和声明标准代理 一样,只是它们使用针对多播代理的宏变种。
声明宏 | 描述 |
---|---|
| 创建一个多播的多播代理。 |
| 创建一个动态的多播代理。 |
| 创建一个封装的动态多播代理。 |
绑定多播代理
多播代理在代理触发时可能会调用多个函数绑定。因此,绑定函数在语句中看起来更为像是数组。
函数 | 描述 |
---|---|
| 添加函数代理到此多播代理的调用列表。 |
| 添加一个原始的C++指针全局函数代理。 |
| 添加一个原始的C++指针代理。原始指针不使用任何引用,所以如果从代理的底层删除了该对象,那么调用它可能是不安全的。因此,当调用Execute()时一定要小心! |
| 添加一个基于共享指针(快速,非线程安全)的成员函数代理。共享指针代理保持到您的对象的弱引用。 |
| 添加一个基于UObject的成员函数代理。UObject 代理保持到您的对象的弱引用。 |
| 将函数从这个多播代理的调用列表中移除(性能为O(N))。请注意代理的顺序可能不会被保留! |
| 将所有函数从与特定UserObject绑定的多播代理的调用列表中移除。请注意代理的顺序可能不会被保留! |
RemoveAll()
将会移除所有与提供的指针绑定的注册代理! 不与对象指针绑定的原始代理将不会被此函数移除!
请参照 DelegateSignatureImpl.inl
(located in ..\UE4\Engine\Source\Runtime\Core\Public\Templates\
) 文件获得关于这些函数的变种、参数及实现相关的信息。
多播代理执行
多播代理允许您附加多个函数代理,然后通过调用多播代理的 Broadcast()
函数一次性执行所有函数代理。多播代理的签名不能使用返回值。
任何时候在多播代理上调用 Broadcast()
函数都是安全的,即时它没有绑定任何函数也可以。唯一需要注意的时候是您使用代理初始化输出变量时,这样做一般是非常不好的。
当调用 Broadcast()
函数时,绑定函数的执行顺序是不确定的。可能并不按照函数的添加顺序执行。
函数 | 描述 |
---|---|
| 广播该代理到所有绑定对象,可能过期的对象除外。 |