为什么要用 SEL

主要是 API 要求的,其它情况另定

Summary

可以理解 @selector() 就是取类方法的编号,

它的行为基本可以等同 C语言 中的函数指针,

只不过 C 语言 中,可以把函数名直接赋给一个函数指针,

而 Object-C 的类不能直接应用函数指针,

这样只能做一个 @selector 语法来取.

每个 SEL 类型数据都是一个方法。

SEL 就是对方法的一种包装。

包装的 SEL 类型数据它对应相应的方法地址,

找到方法地址就可以调用方法。

在内存中每个类的方法都存储在类对象中,

每个方法都有一个与之对应的 SEL 类型的数据,

根据一个 SEL 数据就可以找到对应的方法地址,

进而调用方法。

Demo

#import "ViewController.h"

#define SuppressPerformSelectorLeakWarning(Stuff) \

do { \

_Pragma("clang diagnostic push") \

_Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \

Stuff; \

_Pragma("clang diagnostic pop") \

} while (0)

@interface ViewController ()

@end

@interface Person : NSObject

- (void)test;

- (void)test:(NSString *)string;

@end

@implementation Person

- (void)test {

NSLog(@"___test___");

}

- (void)test:(NSString *)string {

NSLog(@"___test___%@", string);

}

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view.

Person *p = [Person new];

// 手动把 test 方法包装成 SEL 类型

SEL s1 = @selector(test);

SEL s2 = @selector(test:);

// 响应方法

SuppressPerformSelectorLeakWarning([p performSelector:s1]);

SuppressPerformSelectorLeakWarning([p performSelector:s2 withObject:@"参数"]);

SEL selector1 = NSSelectorFromString(@"test");

((void (*)(id, SEL))[p methodForSelector:selector1])(p, selector1);

}

@end

我的理解

Person *p = [Person new];

// 第一步,就是用 SEL 定义一个对象,这个对象用 @selector 的方式拥有了 p 的(test)方法

SEL s1 = @selector(test);

// 第二步,执行这个 s1 对象,就是执行这个方法

[p performSelector:s1]

【原创:iOS第九层】

c语言中int sel是什么意思,SEL的理解相关推荐

  1. int在c语言中的作用,C语言中int,Uint,uint16等有什么区别以及用处

    C语言中int,Uint,uint16等有什么区别以及用处.在C中,既然有了int,为什么还要有uint?特别是uint16,uint32等又有什么用?他们有什么区别?" --------- ...

  2. c语言int作用,c语言中int的用法

    C/C++编程语言中,int表示整型变量,是一种数据类型,下面学习啦小编就跟你们详细介绍下c语言中int的用法,希望对你们有用. c语言中int的用法:整型int C 语言提供了很多整数类型(整型), ...

  3. C语言中int、long等类型所占的字节数

    C语言中int.long等类型所占的字节数.实验环境是win10,64位操作系统. #include<stdio.h> int main() {printf("sizeof(in ...

  4. c语言int作用,c语言中int的用法有哪些

    c语言中int的用法有哪些 C/C++编程语言中,int表示整型变量,是一种数据类型,用于定义一个整型变量,在不同编译环境有不同的大小,不同编译运行环境大小不同下面小编给大家整理了c语言中int的用法 ...

  5. c语言中int作用,c语言中int的用法(5页)-原创力文档

    第 第 PAGE 1 页 共 NUMPAGES 1 页 c语言中int的用法 C/C++编程语言中,int表示整型变量,是一种数据类型,下面小编就跟你们详细介绍下c语言中int的用法,希望对你们有用. ...

  6. c语言double类型是几字节,c语言中int long float double 等类型所占字节及输出表示(转)...

    16位编译器 char :1个字节 char*(即指针变量): 2个字节 short int : 2个字节 int: 2个字节 unsigned int : 2个字节 float: 4个字节 doub ...

  7. c语言数据类型 占字节最少,C语言中int型是所占字节最短的数据类型。

    C语言中int型是所占字节最短的数据类型. 更多相关问题 [单选,A1型题] 满而不痛者,此为痞,载于() [单选,A4型题,A3/A4型题] 钱某,男,16岁,近日因饮酒饱食后出现胃脘胀满疼痛,嗳腐 ...

  8. c语言中argc的作用,C语言中 int main(int argc,char *argv[])的两个参数详解

    C语言中 int main(int argc,char *argv[])的两个参数详解 argc是命令行总的参数个数: argv[]是argc个参数,其中第0个参数是程序的全名,以后的参数.命令行后面 ...

  9. c语言中a*=2*a 1,c语言中int a=2;a+=a*=a-=a*=3;printf("%d",a);怎么做?详细过程

    题目: c语言中int a=2;a+=a*=a-=a*=3;printf("%d",a);怎么做?详细过程 解答: 首先a赋值为2: 然后计算a*=3,此时a为6: 然后计算a-= ...

  10. c语言int16位数据范围,c语言中int取值范围为16位指的是什么16位

    1.c语言中int取值范围为16位指的是什么16位 计算机用二进制表示数值,最小单位就是位(bit),可以储存0或1,16位就是有16个储存0或1的位,其中左边第一位是符号位,0代表+ .1代表-. ...

最新文章

  1. 你知道Java内存是怎么管理的么?
  2. NLPIR智能语义:大数据挖掘助力人工智能快速发展
  3. go语言第一个程序-hello world
  4. linux标准I/O——按行输入和输出
  5. 学JAVA要学redis_新手学习Java对Redis简单操作
  6. 周鸿祎评互联网大佬的编程能力:我能排前三
  7. css 布局 两行, 三行等高
  8. Java Web学习笔记07:数据源、JavaBean与MVC模式
  9. ASP.NET的錯誤類型及錯誤處理方式
  10. 苹果XR信号差,可否要求苹果公司召回?
  11. VB:设定 MsgBox 在若干时间之后若无回应则自动关闭
  12. 努力就一定会成功,这或许是一个问题?
  13. Java快捷键标识符入门学习
  14. 适合自学的C语言基础视频教程
  15. 电脑Windows磁盘修复工具如何使用
  16. HTML5框架 iframe用法 实现嵌套 好玩用法
  17. shiro整合ehcache Cannot resolve reference to bean 'securityManager' while setting bean property 'secur
  18. oreo授权系统V1.1开源版
  19. mysql求和语句大全_经典SQL语句大全(1)
  20. 精彩的“利益均衡”,尤其是“四”

热门文章

  1. wiresshark抓包
  2. 遗传算法优化BP神经网络,bp神经网络的优化算法
  3. Mstar 平台背光时序调试
  4. 启发式算法(heuristic)
  5. FPGA仿锆石代码风格组合电路时序电路严格分开之(一)8通道16位AD采集
  6. 医学成像学习笔记(一):核磁共振成像(MRI)k空间为何是图像频谱详解
  7. Angular学习总结-入门篇
  8. C语言刷题训练营-第一讲
  9. Win11更改系统文件夹的默认保存位置方法分享
  10. php json encode 参数,PHP json_encode函数的参数说明与用法