方法和select器有什么区别?

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

这是一个很好的问题。

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

  • 消息 – 消息是一个select器和你用它发送的参数。 如果我说[dictionary setObject:obj forKey:key] ,那么“message”是select器setObject:forKey:加上参数objkey 。 消息可以封装在一个NSInvocation对象中以供以后调用。 消息被发送到接收器 。 (即,“接收”消息的对象)。

  • 方法 – 一种方法是一个select器和一个实现(和相应的元数据)的组合。 “实现”是实际的代码块; 它是一个函数指针(一个IMP )。 一个实际的方法可以在内部使用一个Method结构体来检索(可以从运行时检索到)。


一些其他相关的东西,你没有要求:

  • 方法签名 – 方法签名表示由方法返回并接受的数据types。 它们可以在运行时通过NSMethodSignature和(在某些情况下)一个原始char*

  • 实现 – 一个方法的实际可执行代码。 它在运行时的types是一个IMP ,它实际上只是一个函数指针。 iOS 4.3包含了将块转换为IMP的新function。 这真的很酷

要认识到的一件有趣的事情是方法(select器)的名称与方法(IMP)的实现不同。 这意味着如果你感觉很大胆的话,你可以把它们换掉。 您也可以在运行时添加和删除方法,因为您所做的只是在散列表中编辑条目:键是select器,值是方法的IMP 。 这可以让你做一些非常疯狂和滑稽的东西。 这不是因为内心的淡淡。 🙂

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

简而言之,select器就像字典中的一个键。 它可以告诉你什么方法,人们正在谈论,但只有你也有字典本身(类或对象)。 这个方法就是当你使用select器作为关键字来请求字典中的值的时候得到的。

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

查看链接,但是我会给出一个简要的总结:

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

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

select器可以是两件事情。 它可以引用一个方法的名字,或者“引用当编译源代码时replace名称的唯一标识符,编译select器的types是SEL”。 (来自: http : //developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html )