Class类型、选择器Selector和函数指针
原文链接 https://gaoxiaosong.github.io/2014/03/14/class-selector-pointer.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
Class类型
Objective-C里面,一个类被正确编译之后,在这个类中存在一个变量用于保存这个类的信息。我们可以通过一个普通的字符串取得这个Class,也可以通过对象取得。Class被成功取得后,可以把它当做一个已经定义好的类来使用。
使用方法:
Class 变量名 = [类或对象 class];
Class 变量名 = [类或对象 superclass];
Class 变量名 = NSClassFromString(类名字的字符串);
NSString * 变量名 = NSStringFromClass(Class参数);
选择器Selector
Objective-C在编译时,会根据方法的名字(包括参数序列),生成一个用来区分这个方法的唯一的ID,这个ID就是SEL类型。不管有没有超类和子类的关系,只要名字相同,那么ID就是一样的。形成"方法名字-方法ID-内存地址"这样一个对应关系。
使用方法:
SEL 变量名 = @selector(方法名字);
SEL 变量名 = NSSelectorFromString(方法名字的字符串);
NSString * 变量名 = NSStringFromSelector(SEL参数);
调用方法:
[对象 performSelector:SEL变量 withObject:参数1 withObject:参数2];
函数指针
函数指针是函数的入口地址。我们可以通过方法ID也就是SEL取得函数指针。
函数指针声明:
void(*setSkinColor_Func)(id, SEL, NSString *);
IMP say_Func;
前者是C语言的函数指针,后者是Objective-C中新的定义方法IMP。
IMP定义如下:
typedef id (*IMP)(id, SEL, ...);
使用方法:
IMP 变量名 = [对象 methodForSelector:SEL对象];
IMP 变量名 = [对象 instanceMethodForSelector:SEL对象];
调用方法:
IMP变量(对象, SEL对象);