美文网首页
SEL 的理解

SEL 的理解

作者: 家电维修技师 | 来源:发表于2019-08-19 19:23 被阅读0次

为什么要用 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第九层】

相关文章

  • SEL 的理解

    为什么要用 SEL Summary Demo 我的理解 【原创:iOS第九层】

  • iOS:SEL与IMP,方法与函数

    SEL与IMP SEL: 类成员方法的指针,可以理解 @selector()就是取类方法的编号通过方法名获取SEL...

  • iOS SEL的理解与使用

    有很多人,认为block的推广可取代代理设计模式,其实block并不能取代代理,代理的模式可以让代码逻辑性更强,更...

  • 对isa、IMP、SEL理解

    ISA 每一个类都会有isa指针,该指针指向类的结构体,如在底层objc_msgSent() 就是通过isa来查找...

  • SEL、IMP和Class

    转载自:Objective-C中的SEL、IMP和Class类型 1、SEL类型 例子: SEL say; SEL...

  • Working with Selectors

    1 const char * sel_getName(SEL sel);const char * name...

  • YYKit---NSObject+YYAdd的学习使用

    -(nullable id)performSelectorWithArgs:(SEL)sel, ...; 与- (...

  • objc_setAssociatedObject和objc_ge

    1.@selector原理介绍 SEL 类成员方法的指针 可以理解 @selector()就是取类方法的编号,他的...

  • iOS IMP 与 SEL

    IMP 官方文档 SEL 官方文档 sel_registerName 通过SEL 找到对应的IMP并调用 meth...

  • runtime-method

    method_t数据结构 SEL SEL获取 SEL转字符串 types 方法编码

网友评论

      本文标题:SEL 的理解

      本文链接:https://www.haomeiwen.com/subject/giwesctx.html