Objective-C中的方法、 Select 器和消息之间有什么区别?

推荐答案

这是一个很好的问题.

  • Selector- Select 器是一种方法的核心.您非常熟悉这些 Select 器:allocinitreleasedictionaryWithObjectsAndKeys: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:加上参数objkey.消息可以封装在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.这让你可以做一些非常疯狂的事情.这不是为胆小的人准备的.:)

Objective-c相关问答推荐

在 MacOS 上截屏

使用自动布局自定义纵横比

如何向 UILabel 添加滚动功能

iOS performSelectorOnMainThread 有多个参数

将长格式的 NSString 拆分为多行

UICollectionView 标头未显示

Objective-C 中的 const 与静态 NSStrings

关于如何将项目从 UITableView 拖放到 UITableView 的教程

如何转储存储在 Objective-C 对象(NSArray 或 NSDictionary)中的数据

设置数据后调整 UICollectionView 单元格的大小

如何从 CGPoint 和 CGSize 创建 CGRect?

未知类型名称类;您指的是 'Class' 吗?

iPhone 上 SQLite 的最佳 Cocoa/Objective-C 包装器库

使用 NSLog 打印 NSData

在 iOS UILabel 上设置 BOLD 字体

Highlighted 和 Selected UIButton 的 State 有什么区别?

在 UITableView 的 iOS 文档目录中列出保存的文件?

如何从 UIColor 对象中获取红绿蓝 (RGB) 和 alpha?

如何判断 NSString 的最后一个字符

将 Xcode 组创建为文件系统文件夹的工作流程