这是一个很好的问题.
Selector- Select 器是一种方法的核心.您非常熟悉这些 Select 器:alloc
、init
、release
、dictionaryWithObjectsAndKeys:
、setObject:forKey:
等.请注意,冒号是 Select 器的一部分;这就是我们如何确定这种方法需要参数.此外(尽管非常罕见),你也可以有这样的 Select 器:doFoo:::
.这是一个需要三个参数的方法,你可以像[someObject doFoo:arg1 :arg2 :arg3]
一样调用它. Select 器组件的每个部分前都不需要字母.正如我所说,这是极为罕见的,你不会在Cocoa框架中找到它.您可以直接在Cocoa中使用 Select 器.他们有SEL
型:SEL aSelector = @selector(doSomething:)
型或SEL aSelector = NSSelectorFromString(@"doSomething:");
型
Message-消息是一个 Select 器,以及你随它发送的参数.如果我说[dictionary setObject:obj forKey:key]
,那么"消息"是 Select 器setObject:forKey:
加上参数obj
和key
.消息可以封装在NSInvocation
对象中,以便以后调用.消息被发送到一个receiver.(即,"接收"消息的对象).
Method-方法是 Select 器和实现(以及附带的元数据)的组合."实现"是实际的代码块;这是一个函数指针(IMP
).可以使用Method
struct (可从运行时检索)在内部检索实际方法.
其他一些你没有要求的相关事情:
Method Signature-方法签名表示方法返回并接受的数据类型.它们可以在运行时通过NSMethodSignature
和(在某些情况下)原始char*
来表示.
Implementation-方法的实际可执行代码.它在运行时的类型是IMP
,实际上只是一个函数指针.iOS 4.3新增了将一个区块转换为IMP
的功能.这里是really cool.
有趣的是,方法的name( Select 器)不同于方法的implementation(IMP).这意味着,如果你有胆量的话,你可以交换它们.您还可以在运行时添加和删除方法,因为您所做的只是编辑哈希表中的一个条目:键是 Select 器,值是方法的IMP
.这让你可以做一些非常疯狂的事情.这不是为胆小的人准备的.:)