使用代理时候,要频繁检测委托类是否能响应方法

2019-05-06  本文已影响0人  guoguojianshu

一般是这样进行检测的

这样检测会每次调用都进行检测,一般只有第一次检测才有,所以可以把第一次的检测结果保存起来,下面就使用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


上一篇 下一篇

猜你喜欢

热点阅读