2012-02-27 185 views

回答

0

简而言之,NSInvocation不如块。它只是将单个方法调用封装在单个对象上,而块可以封装许多行任意代码。即使你的非常简单的平方块也不可能代表使用一个调用,而不需要现有类的支持,而这个类会自动调整平方。

3

NSInvocation是一个消息(使用选择器)给一个对象,带有可选参数,可以稍后(或现在)执行,也可以在当前上下文之外执行(当然你也可以复制vs保留或引用,如果你移动它)。 NSInvocation有一个好处,你可以有选择地复制/引用你所需要的。

该块是一个秘密的本地函数定义,它可以捕获当前线程的上下文的部分或完全。它比NSInvocation配置起来要容易一些,因为它会自动捕获,复制并保留线程(或范围)本地上下文。块可以稍微增加二进制大小,类似于函数。如果从本地环境中取出(例如,当您复制块时),与NSInvocation相比,块可能需要相当多的CPU时间和内存。

3

NSInvocation是封装消息调用的对象:目标对象,选择器,参数和返回值。块是一个对象,它封装了一段代码和一些关于该段引导的程序状态的信息:具体来说,它将变量记录在调用堆栈中,直到创建块为止。

这两者都可以清楚地用作回调函数:您可以使用调用将消息发送给对象,也可以像函数一样执行块的代码。他们的不同之处在于你在各种情况下运输状态的方式。通过调用,您可能需要目标对象或其中一个参数来表示消息出现的上下文。使用块时,该上下文将从块创建时的状态自动捕获。

+0

block是一个函数吗?或对象?正如@Justin所说:该块是一个秘密的本地函数定义 – holsety 2012-02-27 10:45:40

+0

这是两个:)。块是一个匿名函数,以及创建块时的堆栈副本(或多或少)。它也是一个Objective-C对象,因此您可以创建块的副本并随后发布这些副本。当你执行这个块时,你只是在调用它的函数。尽管运行时也会在进入函数之前设置块的堆栈。 – 2012-02-27 10:52:36

相关问题