Class类型、选择器Selector和函数指针

2014-03-14 Xiaosong Gao 更多博文 » 博客 » GitHub »

iOS

原文链接 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对象);