Class (简单说获得它的类 )函数
当一个类被正确的编译事后,在这个编译成功的类里面,存在一个变量用于保存这个类的信息。spa
咱们能够经过一个普通的 字符串 取得 这个Class。翻译
也能够经过咱们生成的 对象 取得这个Class。orm
Class被成功取得以后,咱们能够把这个Class看成一个已经定义好的类来使用它。对象
1.能够Class来获得 对象的 类,ci
2.也能够在程序执行的阶段动态的生成一个在编译阶段没法肯定的一个对象。 开发
由于Class里面保存了一个类的全部信息,(咱们也能够取得一个类的超类)。关于Class类型,具体的使用格式以下:
字符串
1.经过向一个类或者对象发送class消息来得到这个类或者对象的Class变量。it
Class 变量名 = [类或者对象 class]; io
2.经过向一个类或者对象发送superclass消息来得到这个类或者对象的超类的Class变量。
Class 变量名 = [类或者对象 superclass];
3.经过调用NSClassFromString函数,而且把一个字符串做为参数来取得Class变量。这个在咱们使用配置文件决定执行某个类的时候,NSClassFromString给咱们带来了极大的方便。
Class 变量名 = NSClassFromString(@"字符串");
4.函数NSStringFromClass,经过一个Class类型做为变量取得一个类的名字。
NSString *变量名 = NSStringFromClass(Class参数);
当咱们在程序里面经过使用上面的第一,二或者第三行代码成功的取得一个Class类型的变量,好比说咱们把这个变量名字命名为myClass,那么咱们在之后的代码种能够把myClass看成一个咱们已经定义好的类来使用,固然咱们能够把这个变量做为参数传递到其余的方法当中让其余的方法动态的生成咱们须要的对象。
NSClassFromString是一个颇有用的东西,尤为在进行iPhone toolchain的开发上。
正常来讲,
id myObj = [[NSClassFromString(@"MySpecialClass") alloc] init];
和
id myObj = [[MySpecialClass alloc] init];
是同样的。可是,若是你的程序中并不存在MySpecialClass这个类,下面的写法会出错,而上面的写法只是返回一个空对象而已。
所以,在某些状况下,能够使用NSClassFromString来进行你不肯定的类的初始化。
好比在iPhone中,NSTask可能就会出现这种状况,因此在你须要使用NSTask时,最好使用:
[[NSClassFromString(@"NSTask") .....]]
而不要直接使用[NSTask ...]这种写法。
NSClassFromString的好处是:
1 弱化链接,所以并不会把没有的Framework也link到程序中。
2 不须要使用import,由于类是动态加载的,只要存在就能够加载。所以若是你的toolchain中没有某个类的头文件定义,而你确信这个类是能够用的,那么也能够用这种方法。
NSStringFromSelector
SEL sel=@selector(compare:);
NSString *functionName= NSStringFromSelector(sel);
SEL anotherSel=NSSelectorFromString(方法名字的字符串);
在编译时设置变量为SEL变量最有效的方法就是@selector()指令。然而,在某些状况下,你可能须要在运行时转换一个字符串为一个selector。
第一行是直接在程序里面写上方法的名字,第2行是经过sel变量获取方法的名字。第三行是写上方法名字的字符串.
咱们获得 SEL变量以后,能够经过下面的调用来给一个对象发送消息:
[对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];
这样的机制增长了程序的灵活性,能够经过给一个方法传递sel参数,让这个方法动态的执行某一个方法,咱们也能够经过配置文件制定须要执行的方法,程序读取配置文件以后把方法的字符串翻译成sel变量而后给相应的对象发送这个消息
从效率的角度上来讲,执行的时候不是经过方法名字而是经过方法的ID来查找方法,因为整数的查找比匹配字符串快得多,因此这样能够在某种程序上提升执行的效率