NSObject(续)

2020-09-23  本文已影响0人  我不白先生

1.1方法选择器
1.1.1 也是一种新的数据类型,用于唯一标识了类中的方法
1.1.2 该数据的数据类型是SEL
1.1.3 该数据可以通过@selector获得
1.1.4 intancesRespondToSelector:判断一个类中是否有指定的方法
1.1.5 respondsToSelector:判断一个对象是否能调用指定的方法
1.1.6 performSelector:用于调用方法选择器标识的方法(很重要这个方法多态的另一种形式其中另外两个继承多态、协议多态)
ViewController.m

#import "ViewController.h"
#import "TRStudent.h"
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *outputLabel;
-(void)printSelector:(SEL)s target:(id)obj;
@end
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    TRStudent *stu = [TRStudent studentWithName:@"张三" andAge:18];
    SEL s = @selector(study);//通过@selector获得TRStudent类中study方法的方法选择器s
    //ntancesRespondToSelector:判断一个类中是否有指定的方法
    if ([TRStudent instancesRespondToSelector:s])
    {
        self.outputLabel.text = @"类TRStudent中有study方法";//判断类里有没有相应地方法
    }
    if([TRStudent instancesRespondToSelector:@selector(learn)])
    {
        self.outputLabel.text = @"类TRStudent中有learn方法";
    }
    //respondsToSelector:判断一个对象是否能调用指定的方法
    if([stu respondsToSelector:s])
    {
        self.outputLabel.text = @"对象stu能调用study方法";//对象里面有没有相应地方法
    }
    //performSelector:用于调用方法选择器标识的方法
    self.outputLabel.text = [stu performSelector:s];//等效于[stu study];
    s = @selector(rest);
     self.outputLabel.text = [stu performSelector:s];//等效于[stu rest];
    [self printSelector:s target:stu];
    [self printSelector:@selector(study) target:stu];
    NSString *str = @"";
    [self printSelector:s target:str];
    }
-(void)printSelector:(SEL)s target:(id)obj
{   if([obj respondsToSelector:s])
   {
    self.outputLabel.text = [obj performSelector: s];
   }
    else
    {
        self.outputLabel.text = @"对象obj无法调用方法s";
    }
}

1.2 协议选择器
1.2.1 也是一种新的数据类型,用于唯一标识工程中的协议
1.2.2 该数据的数据类型是Protocol*
1.2.3 该数据可以通过@Ptotocol获得
1.2.4 conformToProtocol:判断某个类是否采纳了指定的协议

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    Protocol *p = @protocol(NSCopying);//通过@protocol获取协议选择器p
    //conformToProtocol:判断某个类是否采纳了指定的协议
    if([TRTeacher conformsToProtocol:p])
    {
        self.outputLabel.text = @"类TRTeacher采纳了NSCopying协议";
    }
上一篇下一篇

猜你喜欢

热点阅读