NSInvocation Objective-C

请参阅本的原贴e.James

根据 Apple 的 NSInvocation 类引用

NSInvocation 是一个静态呈现的 Objective-C 消息,也就是说,它是一个变成对象的动作。

而且,更详细一点

信息的概念是客观 c 哲学的核心。每次调用方法或访问某个对象的变量时,都会向其发送消息。当你想要在不同的时间点向对象发送消息或者多次发送相同的消息时,NSInvocation 会派上用场。NSInvocation 允许你描述要发送的消息,然后稍后调用它(实际上将其发送到目标对象)。

例如,假设你要将字符串添加到数组中。你通常会发送 addObject:消息,如下所示:

[myArray addObject:myString];

现在,假设你想使用 NSInvocation 在其他时间点发送此消息:

首先,你准备一个 NSInvocation 对象用于 NSMutableArrayaddObject:选择器:

NSMethodSignature * mySignature = [NSMutableArray
    instanceMethodSignatureForSelector:@selector(addObject:)];
NSInvocation * myInvocation = [NSInvocation
    invocationWithMethodSignature:mySignature];

接下来,你将指定将消息发送到的对象:

[myInvocation setTarget:myArray];

指定要发送到该对象的消息:

[myInvocation setSelector:@selector(addObject:)];

并填写该方法的任何参数:

[myInvocation setArgument:&myString atIndex:2];

请注意,对象参数必须通过指针传递。感谢 Ryan McCuaig 指出这一点,请参阅 Apple 的文档了解更多详情。

此时,myInvocation 是一个完整的对象,描述了可以发送的消息。要实际发送消息,你可以致电:

[myInvocation invoke];

最后一步将导致消息被发送,基本上执行 [myArray addObject:myString];

可以想象它就像发送电子邮件一样。你打开一个新电子邮件(NSInvocation 对象),填写要将其发送给的人(对象)的地址,键入收件人的消息(指定 selector 和参数),然后单击发送 (叫 invoke)。

有关更多信息,请参阅使用 NSInvocation

NSUndoManager 使用 NSInvocation 对象,以便它可以反转命令。基本上,你正在做的是创建一个 NSInvocation 对象来说:“嘿,如果你想撤消我刚刚做的事情,请将这个消息发送到该对象,并使用这些参数”。你将 NSInvocation 对象提供给 NSUndoManager,并将该对象添加到可撤消操作数组中。如果用户调用 Undo,则 NSUndoManager 只查找数组中最近的动作,并调用存储的 NSInvocation 对象来执行必要的操作。

有关更多详细信息,请参阅注册撤消操作