zoukankan      html  css  js  c++  java
  • 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)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。

  • 相关阅读:
    python小记(4)
    python小记(3)
    python小记(2)
    python小记(1)
    Linux学习
    plist文件的 偏好设置 存储与读取 自定义对象归档
    控制器创建的三种方式
    IOS应用启动过程
    pch文件中自定义log
    textLabel辅助试图及toolBar创建使用
  • 原文地址:https://www.cnblogs.com/yaowen/p/5310821.html
Copyright © 2011-2022 走看看