一、SEL类型基本概念
1、SEL(selector)就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。
找方法的过程:
(1)首先把test这个方法名包装成sel类型的数据。
(2)其次根据SEL数据找到对应的方法地址。
(3)最后根据方法地址调用相应的方法。
注:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。
二、SEL类型的作用
详细见代码:
1 #import <Foundation/Foundation.h> 2 @interface Person : NSObject 3 - (void)sleep; 4 - (void)eat:(NSString *)food; 5 @end 6 @implementation Person 7 - (void)sleep 8 { 9 NSString *str = NSStringFromSelector(_cmd);//此处的_cmd相当于@select(sleep) 10 NSLog(@"人喜欢睡觉 %@",str); 11 } 12 - (void)eat:(NSString *)food 13 { 14 NSLog(@"人喜欢吃%@",food); 15 } 16 17 @end 18 int main(int argc, const char * argv[]) { 19 @autoreleasepool { 20 Person *p = [[Person alloc] init]; 21 //1、将eat方法包装成SEL对象 22 SEL sel = @selector(sleep); 23 //p对象是否实现了eat方法 24 BOOL flag = [p respondsToSelector:sel]; 25 NSLog(@"flag: %d",flag); 26 27 28 //2、间接的调用eat和eat:方法,最多可以传两个参数! 29 [p performSelector:@selector(sleep)]; 30 [p performSelector:@selector(eat:) withObject:@"麻辣烫"]; 31 //上面的方法都可以先创建SEL sel1 = @selector(eat:);但是代入之后会警告PerformSelector may cause a leak because its selector is unknown! 去除警告的方法详见http://www.tuicool.com/articles/iu6zuu 32 33 //3、如只知道字符串是Person方法时 34 NSString *name = @"sleep"; 35 [p performSelector:NSSelectorFromString(name)]; 36 37 } 38 return 0; 39 }
打印的结果:
2016-04-29 10:19:31.389 SEL[10053:1696298] flag: 1 2016-04-29 10:19:31.392 SEL[10053:1696298] 人喜欢睡觉 sleep 2016-04-29 10:19:31.392 SEL[10053:1696298] 人喜欢吃麻辣烫 2016-04-29 10:19:31.392 SEL[10053:1696298] 人喜欢睡觉 sleep Program ended with exit code: 0