A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© huh 中级黑马   /  2015-12-26 01:08  /  576 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

是什么?
    是消息机制中的消息!
    是对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

  1. //
  2. //  Person.h
  3. //
  4. #import <Foundation/Foundation.h>
  5. @interface Person : NSObject
  6. -(void)test;
  7. -(void)test2:(int)age;
  8. -(void)test3;
  9. @end
  10. /*
  11. Person.m
  12. SEL _cmd:代表方法本身
  13. */
  14. #import "Person.h"
  15. @implementation Person
  16. -(void)test{
  17.     NSLog(@"执行了...");
  18. }
  19. -(void)test2:(int)age{
  20.     NSLog(@"执行了...%d",age);
  21. }
  22. -(void)test3{
  23.     //_cmd 代表方法本身,如何证明?
  24.     //把SEL转换为字符串,如果打印出来的字符串为方法名
  25.     //就证明_cmd为方法本身!
  26.     NSString *  foun =  NSStringFromSelector(_cmd);
  27.     NSLog(@"%@",foun);
  28.    
  29.     //[self performSelector:_cmd];//等同于 [self test3];死循环
  30. }
  31. @end
  32. /*
  33. main
  34. 是什么?
  35.     是消息机制中的消息
  36.     是isa指针发出消息的封装
  37.     调用方法时,所发出消息就是封装了方法的SEL
  38. _cmd是什么?
  39.     是消息类.SEL _cmd
  40.     在方法里面,代表方法本身!
  41. 在方法里面代表方法本身的SEL指针是什么?
  42.     就是_cmd
  43. 注意:
  44.     1)OC中有参数的方法名,都是带:得!
  45.     2)将SEL转换为NSString对象
  46.       NSString *  foun =  NSStringFromSelector(_cmd);
  47.     3)_cmd代表方法本身,要避免死循环!
  48.     -(void) test3{
  49.     [self performSelector:_cmd];//等同于 [self test3];死循环
  50.     }
  51. */
  52. #import <Foundation/Foundation.h>
  53. #import "Person.h"
  54. int main(int argc, const char * argv[]) {
  55.     Person *per = [[Person alloc]init];
  56.     [per test];
  57.     [per test2:10];
  58.    
  59.     //SEL方式调用方法
  60.     //第一种,无参方法的调用
  61.     SEL sel = @selector(test);//创建SEL
  62.     [per performSelector:sel];//发消息
  63.    
  64.     //第二种,有参方法的调用
  65.     SEL sel2 = @selector(test2:);
  66.     [per performSelector:sel2 withObject:12];
  67.    
  68.     //第三种,通过把方法名的字符串,转换为SEL,来调用方法
  69.     SEL sel3 = NSSelectorFromString(@"test");//把字符串,转换为SEL
  70.     [per performSelector:sel3];
  71.     //注意,有参数的方法名,是带:得
  72.     SEL sel4 = NSSelectorFromString(@"test2:");
  73.     [per performSelector:sel4 withObject:32];
  74.    
  75.     //test3 证明_cmd代表方法本身
  76.     [per test3];
  77.     return 0;
  78. }
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马