非常感谢this post,我熟悉__block关键字。 它基本上意味着不复制实例,而只是传递它的原始参考。我认为这样做是目标C中的方法参数__block?
好处:
- 该实例所作的块内的任何修改都会反映原始实例。
- 避免复制我们要在块中使用的实例的“浪费”。
我很好奇,不过,有多少我们应该真正与这个声明麻烦,例如,如果我有这个方法接收一个callback
块作为参数:
-(void)doSomethingWithCallback:(MyTypeOfCallback)callback;
,让我们说这个方法调用另一个回调作为参数的方法。它是那么值得__block
原callback
参数,如果我们想要把它下一个方法里面:
-(void)doSomethingWithCallback:(MyTypeOfCallback)callback
{
__block MyTypeOfCallback blockCallback = callback;
[self doAnotherThingWithBlock:^(BOOL result) {
if (result)
blockCallback();
}];
}
,或者我应该简单地调用next方法里面原来block
参数?
-(void)doSomethingWithCallback:(MyTypeOfCallback)callback
{
[self doAnotherThingWithBlock:^(BOOL result) {
if (result)
callback();
}];
}
我这么问是因为它是有道理的包括__block选择,但后来我又发现自己做了太多的地方,它开始采取许多行代码。
顺便说一句,这也适用于任何其他类型的参数,不仅块。
没有任何理由可言在你的例子使用'__block'。 '__block'的使用是当一个块外声明的变量需要在块内部修改时。你没有试图重新赋值'callback',所以'__block'变量'blockCallback'没有用处。 – rmaddy
好的,那么避免复制该实例呢? – mllm
这不是你应该担心的。让编译器做它的事情。开发人员不成熟的优化会导致比以往更多的问题。 – rmaddy