objective-c - Objective C 中方法参数的 __block?

标签 objective-c automatic-ref-counting objective-c-blocks

感谢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/

相关文章:

ios - UITableView:删除不可见的行

objective-c - 在 objective-c 中同时使用垃圾收集器和 ARC

ios - 跟踪 _objc_msgSend 在 dispatch_sync block 内崩溃的策略

ios - Objective C 中的表单验证

objective-c - 异常处理帮助 Xcode 4.6

iphone - 如何停止定时器触发的运行循环?

ios - objective-c ,聊天消息应用程序和识别时区

ios - 你能使用 Swift ARC 快速释放稀缺资源(文件描述符、网络套接字)吗?

macos - 将旧代码从 OS X 10.6 更新到 10.7

ios - NSHTTPURLResponse 为 nil 但未生成 NSError