NSInvocation和block之间有什么区别?

时间:2012-02-27 10:04:29

标签: objective-c objective-c-blocks nsinvocation

当我说阻止我的意思是:

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

此外,阻止仅支持iOS4及更高版本。

这两者有什么区别?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:3)

NSInvocation是一个封装消息调用的对象:目标对象,选择器,参数和返回值。块是一个对象,它封装了一段代码和一些关于导致该部分的程序状态的信息:特别是它将变量记录在调用堆栈上直到创建块。

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

答案 2 :(得分:0)

简单地说,NSInvocation不如块强大。它只是将单个方法调用封装在单个对象上,而块可以包含许多行的任意代码。即使你的非常简单的平方块也不可能在没有现有类的支持的情况下使用调用来表示,而这个类本身就可以进行平方。