__block 对于 Objective C 中的方法参数?

__block for method parameters in Objective C?

多亏 this post,我熟悉了 __block 关键字。 它基本上意味着不复制实例,而只是传递其原始引用。

我看到这样做的好处是:

不过,我很好奇,我们真的应该为这个声明操心多少,例如,如果我有这个接收 callback 块作为参数的方法:

-(void)doSomethingWithCallback:(MyTypeOfCallback)callback;

假设此方法以回调作为参数调用另一个方法。如果我们想在下一个方法中调用它,那么 __block 原始 callback 参数是否值得:

-(void)doSomethingWithCallback:(MyTypeOfCallback)callback
{
    __block MyTypeOfCallback blockCallback = callback;
    [self doAnotherThingWithBlock:^(BOOL result) {
       if (result)
           blockCallback();
    }];
}

还是我应该在下一个方法中简单地调用原始的 block 参数?

-(void)doSomethingWithCallback:(MyTypeOfCallback)callback
{
    [self doAnotherThingWithBlock:^(BOOL result) {
       if (result)
           callback();
    }];
}

我问是因为包含 __block 选项很有意义,但我又发现自己在太多地方都这样做了,而且它开始占用很多代码行。

顺便说一句,这也适用于所有其他类型的参数,不仅是块。

It's basically telling the compiler to NOT copy the instance

没有。 __block 与 "instances"没有任何关系__blockvariables.

的存储限定符 变量上的

__block 意味着变量的相同副本将在原始范围之间共享,任何捕获它的块(而不是每个块在捕获时获得变量的单独副本非 __block 变量)。

在你的例子中,你有一个 MyTypeOfCallback 类型的变量,一个(我猜)块指针类型。在第一段代码中,您将其设置为 __block,因此只有一个指针变量,其状态在函数作用域和块(捕获它)之间共享。如果任一范围分配给指针变量,则更改将在另一个范围内可见。

在第二段代码中,你让它成为非__block,当块字面量被执行时,它会把那个指针在那个时刻的值复制到它自己结构中的一个单独的指针变量中,这样你就有了指针的两个副本。如果您之后在函数范围内分配给指针变量,更改将不会对该块可见,因为它有自己的副本。

在这种情况下,两者之间没有区别,因为您在初始化后从未对有问题的指针变量赋值。基本就是一个常量变量,复制一份还是复制两份没有区别。

-(void)doSomethingWithCallback:(MyTypeOfCallback)callback
{
    __block MyTypeOfCallback blockCallback = callback;
    [self doAnotherThingWithBlock:^(BOOL result) {
       if (result)
           blockCallback();
    }];
}

您可以在块中调用回调 so

-(void)doSomethingWithCallback:(void(^)(void))callback
{
    __block typeof(callback)blockCallback = callback;

    [self doAnotherThingWithBlock:^(BOOL result) {
       if (result)
           blockCallback();
    }];
}