• oc-22-sel


    /**
     sel:
     1.作用:包装方法
     2.格式:typedef struct objc_selector *SEL;
     3.用法:
      SEL 名称 = @selector(方法);
      调用形式:
      [对象 performSelector:SEL类型的数据];
     // 判断某个类有没有某个方法
     + (BOOL)instancesRespondToSelector:(SEL)aSelector;
     */
    #import <Foundation/Foundation.h>
    #import "Student.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
             // 1.包装方法,将方法包装成sel格式
            SEL c = @selector(study);
            // 2.创建对象
            Student *s = [Student new];
            // 3.调用包装好的方法
            [s performSelector:c];
            // 4.判断某个类是否有某个方法
            BOOL res = [Student instancesRespondToSelector:c];
            NSLog(@"%d",res);
        }
        return 0;
    }
    注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用 方法。
    • 类中方法存储的原理:

    • 1)类里面的方法都是被转换成SEL变量进行存储的。
    • 2)当类声明一个对象,对象调用方法的时候,系统会把这个方法转换成SEL,然后拿这个SEL到类方法中去匹配。

    • [d run]; ------->SEL 

      • 寻找方法的过程:

      • (1)首先把test这个方法名包装成sel类型的数据;
      • (2)根据SEL数据找到对应的方法地址;
      • (3)根据方法地址调用相应的方法。
      • (4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。

  • 相关阅读:
    Django restfull规范
    Python3中的zip()
    关于负数的isdigit()判断
    Win7 x64安装Paramiko
    深度学习性能提高
    神经网络激励函数
    机器学习十大算法
    深度学习十大框架比较
    python 换行
    python sort() sorted() 与argsort()函数的区别
  • 原文地址:https://www.cnblogs.com/yaowen/p/5310821.html
Copyright © 2020-2023  润新知