我的印象是块应该类似于第一类函数并允许lambda calc风格的构造。然而,从前一个问题来看,我被告知它们实际上只是对象。
然后我真的有两个问题:
除了可以访问其定义范围的功能外,其中 我想它们可以像C ++“友谊”一样使用,为什么呢 那会是一个块而不是一个对象吗?他们更多 轻巧?因为如果不是,我不妨继续传递对象 参数而不是块。
块有办法保持内部状态吗?例如, 在块内声明的一些变量将保留其值 跨调用。
答案 0 :(得分:3)
除了可以访问其定义范围的功能外,我猜这些功能可以像C ++“友谊”一样使用,为什么会选择块而不是对象?
灵活性。少实施。块能够表示多个参数列表或特定对象类型。
它们是否更轻巧?
不一定。只需将它们视为工具箱中的另一个工具,并在适当(或必需)的地方使用它们。
块有办法保持内部状态吗?例如,在块内声明的一些变量将在调用之间保留其值。
是的,他们能够执行引用计数以及复制堆栈对象。这并不一定会使它们比表示所需参数的对象更轻量级。
相关强>
答案 1 :(得分:2)
块应该类似于第一类函数[...]它们实际上只是对象。
它们实际上是一流的函数,为了ObjC的目的而实现为对象。在plain-C中,它们也可用,它们具有密切相关但非基于对象的实现。你可以用最方便的方式来思考它们。
为什么会选择一个块而不是一个对象呢?
块是一个可执行的代码块,它自动从其封闭范围中捕获变量。必须更明确地处理自定义对象的状态和操作,并且不那么通用;你不能使用任何旧对象作为完成参数,而可执行对象完全符合该法案。
块有办法保持内部状态吗?例如,在块内声明的一些变量将在调用之间保留其值。
当然,您可以使用函数或方法声明static
变量:
void (^albatross)(void);
albatross = ^{
static int notoriety;
NSLog(@"%d", notoriety++);
};
albatross();
albatross();
albatross();
albatross();