是什么?
是消息机制中的消息!
是对isa指针发出消息的封装!
调用方法时,所发的消息就是这个封装了方法名的SEL!
有什么用?
SEL可以直接调用方法!
怎么用?
第一种
SEL sel = @selector( 方法名);//创建SEL
[对象 performSelector : sel];//发送消息,无参方法
[对象 performSelector : sel withObject: 参数值];//有参方法
第二种
把方法名的字符串,转换为SEL,来调用方法!
SEL sel = NSSelectorFromString(@"方法名");//创建SEL
[对象 performSelector:sel];//发送消息
用的时候注意:
1)OC中带参数的方法名都是有:号得!
2)_cmd是什么?是SEL类,代表方法本身! 类的对象是如何调用方法的呢?(方法是存放在类(类对象)里面) 类的对象(Person对象)通过isa指针,发了个消息,指向类(Person)!如:类的对象要调用test方法,步骤
1)类的对象(Person对象)里面的isa指针,发了个调用test方法的消息,给类对象(Person)!
2) 方法在类对象(Person)里面,是以SEL方式存在!(每个方法,其实都是一个SEL)
isa发了个消息给类对象(Person),类对象(Person)拿到此消息,在方法里面去遍历,
看看有没有跟isa发过来相同名称的SEL,有就拿出去,没有就报错!
3)isa指针发给类对象的消息,其实就是一个封装了方法名的SEL - //
- // Person.h
- //
- #import <Foundation/Foundation.h>
- @interface Person : NSObject
- -(void)test;
- -(void)test2:(int)age;
- -(void)test3;
- @end
- /*
- Person.m
- SEL _cmd:代表方法本身
- */
- #import "Person.h"
- @implementation Person
- -(void)test{
- NSLog(@"执行了...");
- }
- -(void)test2:(int)age{
- NSLog(@"执行了...%d",age);
- }
- -(void)test3{
- //_cmd 代表方法本身,如何证明?
- //把SEL转换为字符串,如果打印出来的字符串为方法名
- //就证明_cmd为方法本身!
- NSString * foun = NSStringFromSelector(_cmd);
- NSLog(@"%@",foun);
-
- //[self performSelector:_cmd];//等同于 [self test3];死循环
- }
- @end
- /*
- main
- 是什么?
- 是消息机制中的消息
- 是isa指针发出消息的封装
- 调用方法时,所发出消息就是封装了方法的SEL
- _cmd是什么?
- 是消息类.SEL _cmd
- 在方法里面,代表方法本身!
- 在方法里面代表方法本身的SEL指针是什么?
- 就是_cmd
- 注意:
- 1)OC中有参数的方法名,都是带:得!
- 2)将SEL转换为NSString对象
- NSString * foun = NSStringFromSelector(_cmd);
- 3)_cmd代表方法本身,要避免死循环!
- -(void) test3{
- [self performSelector:_cmd];//等同于 [self test3];死循环
- }
- */
- #import <Foundation/Foundation.h>
- #import "Person.h"
- int main(int argc, const char * argv[]) {
- Person *per = [[Person alloc]init];
- [per test];
- [per test2:10];
-
- //SEL方式调用方法
- //第一种,无参方法的调用
- SEL sel = @selector(test);//创建SEL
- [per performSelector:sel];//发消息
-
- //第二种,有参方法的调用
- SEL sel2 = @selector(test2:);
- [per performSelector:sel2 withObject:12];
-
- //第三种,通过把方法名的字符串,转换为SEL,来调用方法
- SEL sel3 = NSSelectorFromString(@"test");//把字符串,转换为SEL
- [per performSelector:sel3];
- //注意,有参数的方法名,是带:得
- SEL sel4 = NSSelectorFromString(@"test2:");
- [per performSelector:sel4 withObject:32];
-
- //test3 证明_cmd代表方法本身
- [per test3];
- return 0;
- }
复制代码
|