一般是这样进行检测的
这样检测会每次调用都进行检测,一般只有第一次检测才有,所以可以把第一次的检测结果保存起来,下面就使用c语言的
位段数据类型
进行保存
if ([self.delegate respondsToSelector:@selector(testWithController:)]) {
[self.delegate testWithController:self];
}
使用位段数据类型
struct{
unsigned int examp1 : 8; //这个8表示有8个二进制位
unsigned int examp2 : 4; //这个4表示有4个二进制位
unsigned int examp3 : 2; //这个2表示有2个二进制位
unsigned int examp4 : 1; //这个1表示有1个二进制位,有一个二进制位,就是为0 或者1,这个时候就可以表示Boolean这个值了
}_examp;
具体的使用
定义的一个协议
#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN
@protocol XJGTestProtocol <NSObject>
@optional
-(void)testWithController:(UIViewController *)controller;
@end
NS_ASSUME_NONNULL_END
.h
#import <UIKit/UIKit.h>
#import "XJGTestProtocol.h"
NS_ASSUME_NONNULL_BEGIN
@interface SecondViewController : UIViewController
@property (nonatomic,weak)id< XJGTestProtocol >delegate;
@property (nonatomic,copy)NSString * name;
@end
.m
@interface SecondViewController ()
{
struct {
unsigned int testSucceed : 1 ;
}_delegateFlags;
}
//在setter方法中,对delegate属性赋值,并对位段数据中的某一个与方法是否执行的属性进行赋值操作
-(void)setDelegate:(id<XJGTestProtocol>)delegate{
_delegate = delegate;
_delegateFlags.testSucceed = [_delegate respondsToSelector:@selector(testWithController:)];
}
//直接取位段数据中的值进行检测,不使用上面方法进行检测了,可以优化代理
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
if (_delegateFlags.testSucceed) {
[self.delegate testWithController:self];
}
}
@end
网友评论