- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
NSInvocation
究竟是如何工作的?有好的介绍吗?
我在理解以下代码(来自 Cocoa Programming for Mac OS X,第 3 版)的工作原理方面特别有问题,但我也能够独立于教程示例应用这些概念。代码:
- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index
{
NSLog(@"adding %@ to %@", p, employees);
// Add inverse of this operation to undo stack
NSUndoManager *undo = [self undoManager];
[[undo prepareWithInvocationTarget:self] removeObjectFromEmployeesAtIndex:index];
if (![undo isUndoing])
[undo setActionName:@"Insert Person"];
// Finally, add person to the array
[employees insertObject:p atIndex:index];
}
- (void)removeObjectFromEmployeesAtIndex:(int)index
{
Person *p = [employees objectAtIndex:index];
NSLog(@"removing %@ from %@", p, employees);
// Add inverse of this operation to undo stack
NSUndoManager *undo = [self undoManager];
[[undo prepareWithInvocationTarget:self] insertObject:p
inEmployeesAtIndex:index];
if (![undo isUndoing])
[undo setActionName:@"Delete Person"];
// Finally, remove person from array
[employees removeObjectAtIndex:index];
}
我明白它想要做什么。 (顺便说一句,employees
是自定义 Person
类的 NSArray
。)
作为 .NET 人员,我尝试将不熟悉的 Obj-C 和 Cocoa 概念与大致类似的 .NET 概念联系起来。这是否类似于 .NET 的委托(delegate)概念,但没有类型?
这不是从书中 100% 清楚的,所以我正在寻找真正的 Cocoa/Obj-C 专家的补充内容,目的是让我理解简单 (-ish) 示例背后的基本概念。我真的希望能够独立应用这些知识——直到第 9 章,我都没有遇到任何困难。但是现在……
提前致谢!
最佳答案
根据Apple's NSInvocation class reference :
An
NSInvocation
is an Objective-C message rendered static, that is, it is an action turned into an object.
还有,一点更详细:
消息的概念是 Objective-C 哲学的核心。任何时候你调用一个方法,或者访问某个对象的一个变量,你就是在向它发送一条消息。 NSInvocation
当您想在不同的时间点向对象发送消息或多次发送相同的消息时会派上用场。 NSInvocation
允许你描述你将要发送的消息,然后调用它(实际上是发送到目标对象)。
例如,假设您想将字符串添加到数组中。您通常会按如下方式发送 addObject:
消息:
[myArray addObject:myString];
现在,假设您想使用 NSInvocation
在其他时间点发送此消息:
首先,您将准备一个 NSInvocation
对象以与 NSMutableArray
的 addObject:
选择器一起使用:
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's documentation了解更多详情。
此时,myInvocation
是一个完整的对象,描述了一个可以发送的消息。要实际发送消息,您会调用:
[myInvocation invoke];
这最后一步将导致消息被发送,本质上是执行 [myArray addObject:myString];
.
把它想象成发送电子邮件。您打开一个新电子邮件(NSInvocation
对象),填写您要发送给的人(对象)的地址,为收件人输入一条消息(指定一个 selector
和参数),然后点击“发送”(调用 invoke
)。
见 Using NSInvocation了解更多信息。见 Using NSInvocation如果上述方法不起作用。
NSUndoManager
使用 NSInvocation
对象,以便它可以反转 命令。本质上,您所做的是创建一个 NSInvocation
对象来表示:“嘿,如果您想撤消我刚刚所做的事情,请将此消息发送到该对象,并带有这些参数”。您将 NSInvocation
对象提供给 NSUndoManager
,然后它将该对象添加到可撤消操作的数组中。如果用户调用“Undo”,NSUndoManager
只需在数组中查找最近的操作,并调用存储的 NSInvocation
对象来执行必要的操作。
见 Registering Undo Operations了解更多详情。
关于objective-c - NSInvocation 傻瓜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/313400/
我想完全理解 Java 上的二维 RTree,但我在解释中迷路了,我希望有人能告诉我它们是如何工作的。 我对他们的了解是这样的: 您从具有最大条目数 M 的节点列表开始,当您尝试获得更多值时,您必须拆
我想与 4 个国家足球队(英格兰、比利时、德国和法国)和 n 个日期一起工作 Date Matches 16.03 England X Brazil 16.03
NSInvocation 究竟是如何工作的?有好的介绍吗? 我在理解以下代码(来自 Cocoa Programming for Mac OS X,第 3 版)的工作原理方面特别有问题,但我也能够独立于
我正在尝试学习如何在亚马逊云上成功部署 Symfony2 应用程序。有用的是我从空白的 Ubuntu 开始,安装了 lamp-server^、svn ……其他一些好东西,它运行得很好。 问题:所有 A
我一直在努力了解 getter 和 setter,但没有深入了解。我读过 JavaScript Getters and Setters和 Defining Getters and Setters只是没
如果我没看错,那么 Controller 的功能就是处理 POST 数据,并在技术上通过模型对应用程序(例如数据库)的状态进行更改。 据我了解,View 也从 Model 获取数据。 这就是我对工作流
我正在尝试将日期从一种格式转换为另一种格式:来自例如“2005 年 10 月 29 日”至 2005-10-29。我有一个包含 625 个日期的列表。我使用 Awk。 大多数情况下,转换都有效。然而,
我是一名优秀的程序员,十分优秀!