NSInvocation和block有什么区别?

5

当我说“块”时,我的意思是:

^(int a) {return a*a;};

此外,仅支持iOS4及以上版本的是block。

这两者有何区别?

3个回答

4
一个NSInvocation是向一个对象发送消息(使用选择器),带有可选参数,它可以在稍后(或现在)执行,并在当前上下文之外执行(当然要注意如果您移动它,需要复制还是引用)。NSInvocation的好处是你可以选择性地只复制/引用你所需的内容。
块(block)是一个秘密的本地函数定义,它能够捕获当前线程上下文的部分或全部。相比于NSInvocation,它也更容易配置,因为它会自动捕获、复制和保留线程(或作用域)的本地上下文。与函数类似,块也可能会略微增加您的二进制文件大小。但如果将块从本地上下文中移除(例如,当您复制一个块时),与NSInvocation相比,块可能需要更多的CPU时间和内存。

3
NSInvocation是一个对象,它封装了一个消息调用:目标对象、选择器、参数和返回值。而块是一个对象,它封装了一段代码以及关于程序状态的一些信息,具体来说,它记录了在创建块之前调用堆栈上的变量。
两者都可以明显地用作回调:您可以使用调用将消息发送到对象,或者像执行函数一样执行块的代码。它们的不同之处在于在每种情况下传输状态的方式。使用调用时,您需要目标对象或其中一个参数来表示消息出现的上下文。对于块,此上下文会自动从创建块时的状态中捕获。

块是一个函数?还是对象?正如@Justin所说:块是一个秘密的本地函数定义。 - holsety
它两者都是 :). 一个块是一个匿名函数,以及在创建块时的堆栈副本(或多或少)。它也是一个 Objective-C 对象,因此您可以创建块的副本,然后释放这些副本。当您执行该块时,实际上只是调用其函数;尽管运行时还在进入函数之前设置了块的堆栈。 - user23743

0
简单来说,NSInvocation 比 Blocks 功能弱。它只封装了单个对象上的单个方法调用,而 Blocks 可以封装任意代码行数。即使是最简单的平方 Blocks,如果没有现有类支持计算平方,使用 NSInvocation 表示是不可能的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接