为什么我要使用NSInvocation而不是Block?

时间:2014-04-23 20:24:51

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

有人可以提供使用NSInvocation的具体原因,而不仅仅是使用Block,甚至是常规方法调用吗?我在网上找到NSInvocation的描述,但没有关于使用它的重要地方的例子,甚至没有唯一的选择。

2 个答案:

答案 0 :(得分:3)

NSInvocations和块都可以用于封装方法调用,以及直到运行时才定义的参数和接收器。在块存在之前,NSInvocation是唯一的方法。如果这就是你需要做的全部,那么积木是更好的选择。如今,NSInvocation的使用非常罕见。

但是,与可以表示任意数量的代码以及捕获值的块不同,NSInvocation始终表示单个方法调用。

这有一些优点:

  1. 与不透明的块不同,可以为选择器,接收器,参数和调用方法的签名查询NSInvocation。如果您收到NSInvocation作为方法的参数(与NSObject的-forwardInvocation一样),则可以提取参数并调用其他方法。

  2. 可以使用-initWithMethodSignature:在运行时为任意方法调用构建NSInvocation。例如,如果要为Objective-C实现eval()函数,则可以使用NSInvocation实际调用方法。

答案 1 :(得分:0)

NSInvocation允许您在运行时动态构造和调用Objective-C消息调用,以及在编译时可能不知道的方法,并允许您使用有关的信息设置参数来自方法签名的参数的类型和数量,您在运行时可能不知道这些参数。 (您可能有一个地方需要能够使用不同的签名调用不同的方法,并根据这些签名传递不同的东西。)因此,它为消息传递机制添加了一定级别的动态。我不确定块是如何与此相关的。

如果您希望对象能够处理任意(在编译时不固定)消息,而消息调度系统构造NSInvocation,则-forwardInvocation:中也使用

NSInvocation描述调用的对象并将其传递给您,以便您可以内省并可能修改参数并在另一个对象上调用它或以其他方式处理信息。这在运行时处理消息时增加了很多动态性。我也不知道块与此有什么关系。