SET是对方法的包装,将方法包装成一个sel类型的数据,去寻找对应的那个方法的地址,找到方法地址就能找到方法调用方法了
SEL 类成员方法的指针
可以理解 @selector()就是取类方法的编号,他的行为基本可以等同C语言的中函数指针,只不过C语言中,可以把函数名直接赋给一个函数指针,而Object-C的类不能直接应用函数指针,这样只能做一个@selector语法来取.
它的结果是一个SEL类型。这个类型本质是类方法的编号(函数地址)
内存存储的细节【内存栈区 内存堆区 内存代码区】
类实例出来的对象从内存栈区指向内存堆区,内存堆区的实例对象指向内存堆区的类对象,然后内存堆区的类对象在指向内存代码区【其中还需要几个过程】
方法的存储位置
1.在内存中每个类的方法都存储在类对象中
2.每个方法都有一个与之对应的SEL类型的数据
3.根据一个SEL数据就可以找到对应的方法地址,进而调用方法
4.SEL类型的定义: typedef struct objc_selector *SEL
所以SEL就可以理解成方法的指针
调用代码
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
[p test];
//手动吧test包装成SEL类型
SEL s1 = @selector(test);//结构体不加星号定义,对象再加星号定义,test方法的SEL
[p performSelector:s1];//响应方法,然后可以直接调用这个方法
}
return 0;
}