Objective-C中的方法,选择器和消息之间有什么区别?
Answers:
这是一个很好的问题。
选择器-选择器是方法的名称。你很熟悉这些选择:alloc
,init
,release
,dictionaryWithObjectsAndKeys:
,setObject:forKey:
,等。注意,冒号是选择的一部分; 这就是我们确定此方法需要参数的方式。另外(尽管这种情况极为罕见),您可以具有如下选择器:doFoo:::
。这是一个采用三个参数的方法,您可以像一样调用它[someObject doFoo:arg1 :arg2 :arg3]
。不需要在选择器组件的每个部分之前都包含字母。就像我说的那样,这非常罕见,您不会在Cocoa框架中找到它。您可以直接在Cocoa中使用选择器。它们具有以下类型SEL
: SEL aSelector = @selector(doSomething:)
或SEL aSelector = NSSelectorFromString(@"doSomething:");
消息-消息是选择器,以及您要随其发送的参数。如果我说的话[dictionary setObject:obj forKey:key]
,那么“消息”就是选择器setObject:forKey:
加上参数obj
和key
。消息可以封装在一个NSInvocation
对象中以供以后调用。消息被发送到接收者。(即“接收”消息的对象)。
方法-方法是选择器和实现(以及随附的元数据)的组合。“实现”是实际的代码块;这是一个函数指针(IMP
)。可以使用Method
结构在内部检索实际方法(可从运行时检索)。
您不需要的其他一些相关内容:
方法签名-方法签名表示方法返回并被方法接受的数据类型。它们可以在运行时通过NSMethodSignature
和(在某些情况下)raw表示char*
。
实现-方法的实际可执行代码。它在运行时的类型是IMP
,实际上只是一个函数指针。iOS 4.3包含一项新功能,可以将一个块变成一个IMP
。这真的很酷。
有趣的事情之一是,方法(选择器)的名称与方法(IMP)的实现不同。这意味着,如果您感到胆怯,可以将它们交换。您还可以在运行时添加和删除方法,因为您所做的只是编辑哈希表中的条目:键是选择器,值是IMP
方法的。这使您可以做一些非常疯狂和令人毛骨悚然的事情。不是为了胆小的人。:)
if
语句创建一个方法?我猜这是因为如果没有if
s,我们的方法就会变得更纯净,无法做到其所要求的。得出结论,“状态处理”和围绕它的“动作”不应采用相同的方法。
方法是当要求对象或类执行某些操作时运行的实现。它在其包含类的范围内,因此通过其他类进行引用时会有所不同。选择器是代表方法名称的标识符。它与任何特定的类或方法都不相关,并且可以用于描述任何类的方法,无论它是类还是实例方法。
简单来说,选择器就像字典中的键。它可以告诉您某人正在谈论什么方法,但前提是您还拥有字典本身(类或对象)。当您使用选择器作为键从字典中请求值时,将获得该方法。
该站点很好地概述了所有相关术语:http : //www.otierney.net/objective-c.html
查看链接,但我会给出一个简短的摘要:
方法本质上就像是您惯用的编程语言所习惯的函数方法。
一条消息(来自文章)“一条消息可以动态转发到另一个对象。在Objective-C中的某个对象上调用一条消息并不意味着该对象实现了该消息,只是它知道如何通过某种方式响应它直接实现它或将消息转发到确实知道如何做的对象。”
选择器可能意味着两件事。它可以指代方法的名称,或“指代在编译源代码时替换名称的唯一标识符。已编译选择器的类型为SEL。” (摘自:http : //developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocSelectors.html)