BindRepeating/BindOnce
BindRepeating返回RepeatingCallback函数对象,BindOnce返回OnceCallback函数对象,两者之间的区别时RepeatingCallback可以调用多次,而BindOnce只能调一次。
void Foo() {
printf("Hello, world");
}
base::RepeatingCallback<void()> a = base::BindRepeating(&Foo);
a.Run(); //正确,输出Hello, world
a.Run(); //正确,再次输出Hello, world
base::OnceCallback<void()> a = base::BindOnce(&Foo);
a.Run(); //错误,编译报错
std::move(a).Run(); //正确,输出Hello, world
std::move(a).Run(); //错误,前一次调用已经将a置为空
以下是base::Bind/Callback相关的别名
using Bind = BindRepeating;
using Callback = OnceCallback;
using Closure = RepeatingCallback<void()>;
using OnceClosure = OnceCallback<void()>;
Bind/Callback中的内存管理
由于Chromium代码中有大量的异步操作,因此在调用函数对象之前,函数对象绑定的参数极有可能已经被delete掉了。
比如以下代码中的load_callback函数对象,如果在调用load_callback之前,this指针因为某些原因(比如用户点击MyView的关闭按钮)被delete掉。
auto load_callback = std::bind(&MyView::OnLoadComplete, this