方法和选择器之间有什么区别?

时间:2011-04-09 22:51:56

标签: objective-c selector

Objective-C中方法,选择器和消息之间的区别是什么?

3 个答案:

答案 0 :(得分:136)

这是一个很好的问题。

  • 选择器 - 选择器是方法的名称。您对这些选择器非常熟悉:allocinitreleasedictionaryWithObjectsAndKeys:setObject:forKey:等。请注意冒号是选择器的一部分;这是我们如何确定此方法需要参数。另外(虽然它非常罕见),你可以选择这样的选择器:doFoo:::。这是一个采用三个参数的方法,您可以像[someObject doFoo:arg1 :arg2 :arg3]一样调用它。不要求在选择器组件的每个部分之前都有字母。正如我所说,这是非常罕见的,你不会发现它在Cocoa框架中使用。您可以直接在Cocoa中使用选择器。它们的类型为SELSEL aSelector = @selector(doSomething:)SEL aSelector = NSSelectorFromString(@"doSomething:");

  • 消息 - 消息是选择器以及您随之发送的参数。如果我说[dictionary setObject:obj forKey:key],那么“消息”就是选择器setObject:forKey:加上参数objkey。消息可以封装在NSInvocation对象中,以便以后调用。消息将发送到接收器。 (即,“接收”消息的对象)。

  • 方法 - 方法是选择器和实现(以及附带的元数据)的组合。 “实现”是实际的代码块;它是一个函数指针(IMP)。可以使用Method结构(可从运行时检索)在内部检索实际方法。


您没有要求的其他一些相关事项:

  • 方法签名 - 方法签名表示方法返回和接受的数据类型。它们可以在运行时通过NSMethodSignature和(在某些情况下)原始char*来表示。

  • 实施 - 方法的实际可执行代码。它在运行时的类型是IMP,它实际上只是一个函数指针。 iOS 4.3包含将块转换为IMP的新功能。这非常酷

要实现的一个有趣的事情是方法(选择器)的名称与方法(IMP)的实现不同。这意味着如果你感觉大胆的话可以换掉它们。您还可以在运行时添加和删除方法,因为您所做的只是编辑哈希表中的条目:键是选择器,值是方法的IMP。这可以让你做一些非常疯狂和冒险的事情。这不适合胆小的人。 :)

答案 1 :(得分:9)

方法是在要求对象或类执行某些操作时运行的实现。它在其包含类的范围内,因此在通过其他类引用时是不同的。选择器是表示方法名称的标识符。它与任何特定的类或方法无关,可用于描述任何类的方法,无论它是类还是实例方法。

简单地说,选择器就像字典中的键。它可以告诉你某人正在谈论什么方法,但前提是你自己也有字典(类或对象)。当您使用选择器作为键从字典中请求值时,您将获得该方法。

答案 2 :(得分:1)

此网站对所有相关术语有一个很好的概述:http://www.otierney.net/objective-c.html

查看链接,但我会给出一个快速摘要:

一个方法本质上就像你喜欢的编程语言习惯的函数方法。

消息(来自文章)“消息可以动态转发到另一个对象。在Objective-C中调用对象上的消息并不意味着该对象实现了该消息,只是它知道如何响应它以某种方式直接实现它或将消息转发给知道如何的对象。“

选择器可能意味着两件事。它可以引用方法的名称,或者“引用在编译源代码时替换名称的唯一标识符。编译的选择器是SEL类型。” (来自:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html