• iOS开发 关于SEL的简单总结


     

    SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。

    AD:

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

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

    1.方法的存储位置

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

    2.SEL对象的创建

    1. SEL s1 = @selector(test1); // 将test1方法包装成SEL对象  
    2. SEL s2 = NSSelectorFromString(@"test1"); // 将一个字符串方法转换成为SEL对象 

    3.SEL对象的其他用法

    1. // 将SEL对象转换为NSString对象 
    2. NSString *str = NSStringFromSelector(@selector(test)); 
    3.  
    4.  Person *p = [Person new]; 
    5.  
    6. // 调用对象p的test方法 
    7. [p performSelector:@selector(test)];
    1. /******************************* Person.h文件 **********************************/ 
    2.  
    3. #import <Foundation/Foundation.h> 
    4.  
    5. @interface Person : NSObject 
    6.  
    7. - (void)test1; 
    8.  
    9. - (void)test2:(NSString *)str; 
    10.  
    11. @end 
    12.  
    13. /******************************* Person.m文件 **********************************/ 
    14.  
    15. #import "Person.h" 
    16.  
    17. @implementation Person 
    18.  
    19. - (void)test1 
    20.     NSLog(@"无参数的对象方法"); 
    21.  
    22. - (void)test2:(NSString *)str 
    23.     NSLog(@"带有参数的方法%@",str); 
    24. @end 
    25.  
    26. /******************************* main.m文件 **********************************/ 
    27.  
    28. #import "Person.h" 
    29. #import <Foundation/Foundation.h> 
    30.  
    31. /* 
    32.  调用方法有两种方式: 
    33.  1.直接通过方法名来调用 
    34.  2.间接的通过SEL数据来调用 
    35.  */ 
    36.  
    37. int main(int argc, const char * argv[]) 
    38.     Person *person = [[Person alloc] init]; 
    39.      
    40.     // 1.执行这行代码的时候会把test2包装成SEL类型的数据 
    41.     // 2.然后根据SEL数据找到对应的方法地址(比较耗性能但系统会有缓存) 
    42.     // 3.在根据方法地址调用对应的方法 
    43.      
    44.     [person test1]; 
    45.      
    46.     // 将方法直接包装成SEL数据类型来调用 withObject:传入的参数 
    47.     [person performSelector:@selector(test1)]; 
    48.     [person performSelector:@selector(test2:) withObject:@"传入参数"]; 
    49.      
    50.     return 0; 
  • 相关阅读:
    数字三角形
    嵌套矩阵问题
    NKOJ1236 a^b
    历届试题 最大子阵
    【动态规划】最大连续子序列和,最大子矩阵和,最大m子段和
    历届试题 翻硬币
    历届试题 带分数
    用户模板和用户场景
    学习进度——第九周
    最大子数组——回调
  • 原文地址:https://www.cnblogs.com/chengjun/p/4881330.html
Copyright © 2020-2023  润新知