1、SEL概念
SEL:全称selector 表示方法的存储位置
3、方法在内存中的存储原理
Person *p=[[Person alloc] init];
[p test];
寻找方法的过程:
(1)首先把test这个方法名包装成sel类型的数据;
(2)根据SEL数据找到对应的方法地址;
(3)根据方法地址调用相应的方法。20
(4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候,就直接使用。
关于_cmd:每个方法的内部都有一个-cmd,代表着当前方法。
注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到 方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。
4、公式
SEL s1 = @selector(eat); //通过s1 去调用了
[p2 performSelector:s1];
5、程序
我的程序
/***************************main.m********************************/
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool
{
Person *wangcai =[Person new];
[wangcai run];
SEL s1; //定义一个sel类型s1变量
s1=@selector(run); //
[wangcai performSelector:s1];
}
return 0;
}
/***************************Person.h*******************************/
#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void)run;
@end
/***************************Person.m*******************************/
#import "Person.h"
@implementation Person
-(void)run
{
NSLog(@"人在跑!");
}
@end
/***************************************************************/
老师程序
/***************************main.m********************************/
#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
// [p run];
//1)run ---> SEL类型的数据
//2)SEL 类型的数据,类中方法的SEL对比,找到方法的地址
//3)根据方法的地址,调用run方法
//手动把 run方法 转换为 sel类型的数据
// 如何转@selector(方法名);
SEL s1;
s1 =@selector(run);
//发送s1 向 p对象发送 s1
[p performSelector:s1]; //
}
return 0;
}
/***************************Person.h*******************************/
#import <Foundation/Foundation.h>
@interface Person : NSObject
-(void)run;
@end
/***************************Person.m*******************************/
#import "Person.h"
@implementation Person
-(void)run{
NSLog(@"人在走!");
}
@end
|
|