感谢this post ,我熟悉 __block 关键字。 它基本上意味着不复制实例,而只是传递其原始引用。
我认为这样做的好处是:
- 对 block 内实例所做的任何修改都会反射(reflect)在原始实例中。
- 避免“浪费”复制我们将在 block 内使用的实例。
不过,我很好奇,我们到底应该对这个声明有多大的麻烦,例如,如果我有一个接收 callback
block 作为参数的方法:
-(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 选项是有意义的,但我又发现自己在太多地方这样做了,并且开始需要很多代码行。
顺便说一句,这也适用于所有其他类型的参数,而不仅仅是 block 。
最佳答案
It's basically telling the compiler to NOT copy the instance
没有。 __block
与“实例”没有任何关系。 __block
是变量的存储限定符。
__block
意味着该变量的相同副本将在捕获该变量的任何 block 的原始范围之间共享(与每个 block 在捕获该变量时获取该变量的单独副本相反)捕获非__block
变量)。
就您而言,您有一个 MyTypeOfCallback
类型的变量,这是一种(我猜测)指针到 block 类型。在第一段代码中,您将其设置为__block
,因此有一个指针变量,其状态在函数作用域和 block (捕获它)之间共享。如果任一作用域分配给指针变量,则更改将在另一个作用域中可见。
在第二段代码中,将其设置为非__block
,并且当执行 block 文字时,它将当时该指针的值复制到其自己的单独指针变量中结构体,这样你就有了指针的两个副本。如果您随后在函数作用域中分配给指针变量,则更改对于 block 来说是不可见的,因为它有自己的副本。
在这种情况下,两者之间没有区别,因为您在初始化后永远不会分配给相关的指针变量。它基本上是一个常量变量,一份或两份没有区别。
关于objective-c - Objective C 中方法参数的 __block?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31897750/