3

我的印象是块应该类似于一流的函数并允许 lambda calc 样式的构造。然而,从之前的问题中,我被告知它们实际上只是对象。

然后我真的有两个问题:

  1. 除了可以访问其定义范围的功能(我猜这使它们能够以类似于 C++“友谊”的方式使用)之外,为什么人们会选择块而不是对象呢?它们更轻吗?因为如果不是,我还不如继续将对象作为参数而不是块传递。

  2. 块有保持内部状态的方法吗?例如,在块内声明的一些变量将在调用中保留其值。

4

2 回答 2

3

除了可以访问其定义范围的功能(我猜这使它们能够以类似于 C++“友谊”的方式使用)之外,为什么人们会选择块而不是对象呢?

灵活性。实施较少。块能够表示的不仅仅是参数列表或特定对象类型。

它们更轻吗?

不必要。只需将它们视为工具箱中的另一个工具,并在适当(或需要)时使用它们。

块有保持内部状态的方法吗?例如,在块内声明的一些变量将在调用中保留其值。

是的,它们能够执行引用计数以及复制堆栈对象。这并不一定会使它们比表示您需要的参数的对象更轻。

有关的

NSInvocation 和 block 有什么区别?

于 2012-04-23T01:42:32.940 回答
2

块应该类似于一流的函数 [...] 它们实际上只是对象。

它们实际上是一流的函数,为了 ObjC 的目的而实现为对象。在plain-C 中,它们也可用,它们具有密切相关但非基于对象的实现。您可以以目前最方便的方式考虑它们。

那为什么要一个块而不是一个对象呢?

块是一个可执行的代码块,它自动从其封闭范围中捕获变量。自定义对象的状态和动作必须更明确地处理,并且不那么通用;您不能使用任何旧对象作为完成参数,而可执行对象完全符合该要求。

块有保持内部状态的方法吗?例如,在块内声明的一些变量将在调用中保留其值。

static当然,您可以像使用函数或方法一样声明变量:

void (^albatross)(void);
albatross = ^{
            static int notoriety;
            NSLog(@"%d", notoriety++);
        };

albatross();
albatross();
albatross();
albatross();
于 2012-04-23T01:52:40.380 回答