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协议";
}