#import
@interface Person : NSObject
+(void)run;
-(void)print;
-(void)signalWithNumber:(NSString *)number andContent:(NSString *)content;
-(void)carryMehtod:(id)p :(SEL)sel;
@end
@implementation Person
+(void)run{
NSLog(@"run!");
}
-(void)print{
NSLog(@"print!");
}
-(void)signalWithNumber:(NSString *)number andContent:(NSString *)content{
NSLog(@"number = %@,content = %@",number,content);
}
-(void)carryMehtod:(id)p :(SEL)sel{
[p performSelector:sel];
}
@end
/*
SEL类型代表着方法的签名,在类对象的方法列表中存储着该签名与方法代码的对应关系
每个类的方法列表都存储在类对象中
每个方法都有一个与之对应的SEL类型的对象
根据一个SEL对象就可以找到方法的地址,进而 调用方法
eg:[p test];
>首先把test方法名包装成sel类型的数据
>根据SEL类型到该类的类对象上去找对应的方法的代码,如果找到该代码就执行
>如果没有找到,就一直往父类上找,直到基类(NSObject)
>如果都没有找到,就会报错
注:方法寻找的过程是有缓存的,第一次找的时候,是一个一个找,非常耗性能,之后,要用到该方法,就从缓存中使用便可
*/
int main(int argc, const char * argv[]) {
@autoreleasepool {
/*1,SEL类型的第一个作用,配合对象/类检查对象/类中有没有存在某个方法
存在某个方法flag返回为YES,否则,返回NO
respondsToSelector:
如果是通过一个对象调用该方法,那么,它判断是否存在的方法是对象方法
如果是通过类调用该方法,那么,它判断是否存在的方法是类方法
*/
SEL sel = @selector(print);
Person *person = [[Person alloc]init];
BOOL flag = [person respondsToSelector:sel];
SEL sel1 = @selector(run);
NSLog(@"flag = %i",flag);
BOOL flag1 = [Person respondsToSelector:sel1];
NSLog(@"flag = %i",flag1);
/*
2,SEL类型的第二个作用,配合对象/类来调用某一个SEL方法
performSelector:只能传递两个参数,都是对象参数,基本数据类型不能用
*/
[person performSelector:sel];
[Person performSelector:sel1];
SEL sel3 = @selector(signalWithNumber:andContent:);
[person signalWithNumber:@"13411379410" andContent:@"你好!"];
/*
3,配合对象,SEL作为参数传递
*/
[person carryMehtod:person :sel];
}
return 0;
}
//2015-12-12 16:56:42.280 11,sel类型[2946:205855] flag = 1
//2015-12-12 16:56:42.281 11,sel类型[2946:205855] flag = 1
//2015-12-12 16:56:42.281 11,sel类型[2946:205855] print!
//2015-12-12 16:56:42.281 11,sel类型[2946:205855] run!
//2015-12-12 16:56:42.281 11,sel类型[2946:205855] number = 13411379410,content = 你好!
//2015-12-12 16:56:42.281 11,sel类型[2946:205855] print!
//Program ended with exit code: 0