• iOS SEL的简单总结


    @interface Person : NSObject
    + (void)test1;
    - (void)test2;
    @end
        // 根据.h文件中定义的Person类和方法 执行完这行代码 在内存中如下
        Person *person = [[Person alloc] init];

    SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法

    1.方法的存储位置

    • 在内存中每个类的方法都存储在类对象中
    • 每个方法都有一个与之对应的SEL类型的数据
    • 根据一个SEL数据就可以找到对应的方法地址,进而调用方法
    • SEL类型的定义:  typedef struct objc_selector *SEL

    2.SEL对象的创建

        SEL s1 = @selector(test1);   // 将test1方法包装成SEL对象 

        SEL s2 = NSSelectorFromString(@"test1");   // 将一个字符串方法转换成为SEL对象

    3.SEL对象的其他用法

    // 将SEL对象转换为NSString对象  
    NSString *str = NSStringFromSelector(@selector(test));

     Person *p = [Person new];

    // 调用对象p的test方法
    [p performSelector:@selector(test)];

    /******************************* Person.h文件 **********************************/
    
    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    - (void)test1;
    
    - (void)test2:(NSString *)str;
    
    @end
    
    /******************************* Person.m文件 **********************************/
    
    #import "Person.h"
    
    @implementation Person
    
    - (void)test1
    {
        NSLog(@"无参数的对象方法");
    }
    
    - (void)test2:(NSString *)str
    {
        NSLog(@"带有参数的方法%@",str);
    }
    @end
    
    /******************************* main.m文件 **********************************/
    
    #import "Person.h"
    #import <Foundation/Foundation.h>
    
    /*
     调用方法有两种方式:
     1.直接通过方法名来调用
     2.间接的通过SEL数据来调用
     */
    
    int main(int argc, const char * argv[])
    {
        Person *person = [[Person alloc] init];
        
        // 1.执行这行代码的时候会把test2包装成SEL类型的数据
        // 2.然后根据SEL数据找到对应的方法地址(比较耗性能但系统会有缓存)
        // 3.在根据方法地址调用对应的方法
        
        [person test1];
        
        // 将方法直接包装成SEL数据类型来调用 withObject:传入的参数
        [person performSelector:@selector(test1)];
        [person performSelector:@selector(test2:) withObject:@"传入参数"];
        
        return 0;
    }
  • 相关阅读:
    es6 数组的扩展
    面向对象的7大原则及其实例
    flex 布局
    一、创建vue
    箭头函数
    destructuring
    spreed&rest
    变量新声明之let、const
    jQuery之遍历索引相关方法
    jQuery之位置坐标图形相关方法
  • 原文地址:https://www.cnblogs.com/QM80/p/3587434.html
Copyright © 2020-2023  润新知