OC-033.SEL类型

SEL是一种数据类型,代表方法签名,通过它就找到这个对象上方法
SEL和id都是一种结构体类型指针

1、定义变量 SEL 变量名称
2、通过@selector(方法名称) 快速生成一个SEL,(selector:选择器的意思,选择使用哪个方法)
3、可以作为方法的实参
4、可以作为方法的形参
5、可以作为方法返回值

使用场景:可以用来做一个通知,通知某个对象去执行某个方法,在方法内部请一定要判断一下是否响应

涉及到的方法:

1.[... performSelector:@selector()]; 让某对象执行某方法

2.[... respondToSelector:@selector()];返回BOOL类型,判断对象是否响应了方法

#import <Foundation/Foundation.h>//------main
#import "LSPerson.h"
#import "LSCar.h"
#import "LSButton.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        SEL sel1 = @selector(say);
        SEL sel2 = @selector(show:);//注意不要忘记加:
        LSPerson *p = [[LSPerson alloc] init];
        if([p respondsToSelector:sel1]){
    //respondsToSelector方法返回bool,表示对象能否响应后面的方法,如何可以,那么就执行。
            [p performSelector:sel1];//这里的sel1是作为实参
            //performSelector这个方法是让对象执行某个方法
        }
        [p performSelector:sel2];
        LSCar *car = [[LSCar alloc] init];
        [p orderCar:car performSelector:@selector(show:)];//这里的sel是作为形参
    
    
        LSButton *button = [[LSButton alloc] init];
        button.sel = @selector(start);
        button.obj = car;
        [button click];
    }
    return 0;
}
#import <Foundation/Foundation.h>//------LSPerson.h

@interface LSPerson : NSObject
@property (nonatomic,assign)int age;
-(void) say;
-(void) show:(int) age;
-(void) orderCar:(id) car performSelector:(SEL) sel;//这里的sel是作为形参
@end
#import "LSPerson.h"//------LSPerson.m

@implementation LSPerson
-(void) say{
    NSLog(@"%s",__func__);
}
-(void) show:(int) age{
    NSLog(@"age = %d",_age);
}
-(void) orderCar:(id) car performSelector:(SEL) sel{
    if ([car respondsToSelector:sel]) {  //判断id对象没是否有这个方法
        NSLog(@"car内有这个方法");
        [car performSelector:sel];
    }else{
        NSLog(@"car内没有这个方法");
    }
}
@end
#import <Foundation/Foundation.h>//------LSCar.h

@interface LSCar : NSObject
-(void) start;
@end
#import "LSCar.h"//------LSCar.m

@implementation LSCar
-(void) start{
    NSLog(@"car发动了");
}
@end
#import <Foundation/Foundation.h>//------LSButton.h

@interface LSButton : NSObject
@property(nonatomic,strong)id obj;
@property(nonatomic,assign)SEL sel;
-(void) click;
@end
#import "LSButton.h"//------LSButton.m

@implementation LSButton
-(void) click{
    if ([self.obj respondsToSelector:self.sel]) {//判断是否响应
        [self.obj performSelector:self.sel]; 
    }
}
@end








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值