这个真的很实用,也很好用。
1、SEL类型
例子:
SEL say;
SEL skin;
Objective-C 在编译的时候, 会根据方法的名字(包括参数序列),生成一个用 来区分这个方法的唯一的一个 ID,这个 ID 就是 SEL 类型的。我们需要注意的是,只要方法的名字(包括参数序列)相同,那么它们的 ID 都是相同的。就是 说,不管是超类还是子类,不管是有没有超类和子类的关系,只要名字相同 那么 ID 就是一样的。
在 程序执行的时候,我们可以方便的通过方法的名字,获取到方法的 ID 也就是我们所说的 SEL, 反之亦然。具体的使用方法如下:
1 SEL 变量名 = @selector(方法名字);
2 SEL 变量名 = NSSelectorFromString(方法名字的字符串);
3 NSString *变量名 = NSStringFromSelector(SEL 参数);
其中第 1 行是直接在程序里面写上方法的名字,第 2 行是写上方法名字的字符串,第 3 行是通 过 SEL 变量获得方法的名字。我们得到了 SEL 变量之后,可以通过下面的调用来给一个对象发 送消息:
[对象 performSelector:SEL 变量 withObject:参数 1 withObject:参数 2];
这样的机制大大的增加了我们的程序的灵活性,我们可以通过给一个方法传递 SEL 参数,让这 个方法动态的执行某一个方法;我们也可以通过配置文件指定需要执行的方法,程序读取配置文 件之后把方法的字符串翻译成为 SEL 变量然后给相应的对象发送这个消息。
从效率的角度上来说,执行的时候不是通过方法名字而是方法 ID 也就是一个整数来查找方法, 由于整数的查找和匹配比字符串要快得多,所以这样可以在某种程度上提高执行的效率。
2、IMP类型
例子:
void(*setSkinColor_Func) (id, SEL, NSString*);//定义一个函数指针(传统C语言的处理方式)
IMP say_Func;//定义一个IMP方式的函数指针(obj-C中推荐的方式)
说白了IMP就是实现方法,给一个方法起个名字,实现动态调用,不用再使用[对象 message]的方式。
IMP 的定义如下:
typedef id (*IMP)(id, SEL, ... );
这个格式正好和我们在第一行代码里面的函数指针的定义是一样的。
我们取得了函数指针之后,也就意味着我们取得了执行的时候的这段方法的代码的入口,这样我 们就可以像普通的 C 语言函数调用一样使用这个函数指针。当然我们可以把函数指针作为参数 传递到其他的方法,或者实例变量里面,从而获得极大的动态性。我们获得了动态性,但是付出 的代价就是编译器不知道我们要执行哪一个方法所以在编译的时候不会替我们找出错误,我们只 有执行的时候才知道,我们写的函数指针是否是正确的。所以,在使用函数指针的时候要非常准 确地把握能够出现的所有可能,并且做出预防。尤其是当你在写一个供他人调用的接口 API 的 时候,这一点非常重要。
3、Class
类在 Objective-C 也为我们准备了类似的机制, Class 类型。当一个类被正确的编译过后,在这个编译成功的类里面,存在一个变量用于保存这 个类的信息。我们可以通过一个普通的字符串取得 这个 Class,也可以通过我们生成的对象取 得这个 Class。Class 被成功取得之后,我们可以把这个 Class 当作一个已经定义好的类来使用 它。这样的机制允许我们在程序执行的过程当中,可以 Class 来得到对象的类,也可以在程序 执行的阶段动态的生成一个在编译阶段无法确定的一个对象。
因为 Class 里面保存了一个类的所有信息,当然,我们也可以取得一个类的超类。关于 Class 类型,具体的使用格式如下:
1 Class 变量名 = [类或者对象 class];
2 Class 变量名 = [类或者对象 superclass];
3 Class 变量名 = NSClassFromString(方法名字的字符串);
4 NSString *变量名 = NSStringFromClass(Class 参数);
第一行代码,是通过向一个类或者对象发送 class 消息来获得这个类或者对象的 Class 变量。 第二行代码,是通过向一个类或者对象发送 superclass 消息来获得这个类或者对象的超类的
Class 变量。
第三行代码,是通过调用 NSClassFromString 函数,并且把一个字符串作为参数来取得 Class 变量。这个在我们使用配置文件决定执行的时候的类的时候,NSClassFromString 给我们带来 了极大的方便。
第四行代码,是 NSClassFromString 的反向函数 NSStringFromClass,通过一个 Class 类 型作为变量取得一个类的名字。
当我们在程序里面通过使用上面的第一,二或者第三行代码成功的取得一个 Class 类型的变量, 比如说我们把这个变量名字命名为 myClass,那么我们在以后的代码种可以把 myClass 当作 一个我们已经定义好的类来使用,当然我们可以把这个变量作为参数传递到其他的方法当中让其 他的方法动态的生成我们需要的对象。
本文转自:
http://hi.baidu.com/men4661273/blog/item/17169561d09e10c08db10d1b.html
分享到:
相关推荐
Objective-C、iOS开发、Mac OS X、编程语言、面向对象编程、内存管理、自动引用计数(ARC)、协议(protocol)、类扩展(category)、键值观察(KVO)、键值编码(KVC)、Block、Delegate模式、多态性、Singleton...
IAI-X-SEL-CHINESS伺服使用文档;中文官方光盘资料;含通讯,IO,指令详细说明
1. Xcode的使用: (1.)代码辅助提示 (2.)调试代码 (3.)定义公司名称 (4.)格式化代码 (5.)使用快照 (6.)批量修改 (7.)快速查找文件 ...(2.)SEL 与IMP (3.)objc_msgSend函数 (4.)动态方法解析 (5.)消息转发
Class(类类型),Selector(选择器SEL),函数指针(IMP) Class(类类型),Selector(选择器SEL),函数指针(IMP)
C语法功能[[AnObject method1] method2]-> AnObject.method1.method2 [self setAlpha:0.5]-> self.alpha = 0.5可用的多行选择键绑定Swift 3.0用法在macOS EI Capitan中安装Xcode 8 sudo / usr / libexec / ...
Docker 容器与容器云(第2版)-完整版-带标签-浙江大学SEL实验室
本套PPT,拥有以下OC语言的内容: ...二、OC的特有语法(点语法、@property、@synthesize关键字、id、构造方法、分类、description、SEL) 三、内存管理 四、协议(protocol)代码块(block) 五、ARC 等等
安装oracle11g是提示缺少包,安装libaio-devel-0.3.107-10.SEL6.x86_64.rpm后,再次检查不再提示。
本教程是介绍IAI-X-SEL控制器的说明,告诉我们如何编程
IAI电缸编程软件X-SEL V7.02.09.00
IAI X-Sel 机械手编程软件,可以编写IAIX_SEL控制器
X-SEL软件中文说明书,,
IAI X-SEL 控制器使用说明书, 可以快速掌握IAI X-SEL 的操作指令, 使用方法, 故障处理等等技术.
SEL-551中文版使用手册,Word格式,可自行编辑
x-sel中文版
sel4-riscv sel4-riscv端口 重要的! 此回购协议是seL4微内核的旧版本/过时版本。 请改用[1]。 要构建一个完整的seL4系统,请查看本文[2],并在此处使用相关的回购协议[3]。 如有任何问题,请随时与我联系! [1]...
Texas Instruments Ethernet Switch Driver.
This only drives GPOs, and can t change direction.
IAI X-sel机械手软件,通讯,说明书 ,数据线驱动等
找了好久,现在分享给大家,不谢,我是雷锋塔,找了好久,现在分享给大家,不谢,我是雷锋塔