如果块是对象,它们如何保持内部状态以及它们比常规对象有什么优势?

时间:2012-04-23 01:04:58

标签: objective-c objective-c-blocks

我的印象是块应该类似于第一类函数并允许lambda calc风格的构造。然而,从前一个问题来看,我被告知它们实际上只是对象。

然后我真的有两个问题:

  1. 除了可以访问其定义范围的功能外,其中 我想它们可以像C ++“友谊”一样使用,为什么呢 那会是一个块而不是一个对象吗?他们更多 轻巧?因为如果不是,我不妨继续传递对象 参数而不是块。

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

2 个答案:

答案 0 :(得分:3)

  

除了可以访问其定义范围的功能外,我猜这些功能可以像C ++“友谊”一样使用,为什么会选择块而不是对象?

灵活性。少实施。块能够表示多个参数列表或特定对象类型。

  

它们是否更轻巧?

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

  

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

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

相关

What's the difference between NSInvocation and block?

答案 1 :(得分:2)

  

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

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

  

为什么会选择一个块而不是一个对象呢?

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

  

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

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

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

albatross();
albatross();
albatross();
albatross();