delegate是否响应方法优化

一般我们使用代理设计模式的时候对于@optional修饰的方法我们一般都会在需要回调的时候使用- (BOOL)respondsToSelector:检测一下是否响应方法调用.

首先我们知道每次需要调用的时候都- (BOOL)respondsToSelector:一下,也就是需要走消息传递的流程的,比较耗时.

那么,我们有什么办法可以优化一下么.

其实,代理方法都是确定的.比如在A实例中我们写了B的代理方法.并且设置了B的代理为A.那么A就能响应B的对应的方法.

根据上面的描述,其实我们可以在设置代理的时候就能把某个代理方法是否响应就能确定下来了.那么我们应该在- (void)setDelegate:方法内缓存下方法是否响应.

我们可以通过以下手段来缓存是否能够响应.比如我下面有俩方法.我通过下面的结构体记录一下

@implementataion

struct {
    unsigned int aaa :1;
    unsigned int bbb :1;
} _delegateHas;

...

@end

然后在setDelegate方法里面检测是否响应.

- (void)setDelegate:(id<XXDelegate>)delegate {
	[super setDelegate:delegate];
	_delegateHas.aaa = [delegate respondsToSelector:@selector(aaa)];
	_delegateHas.bbb = [delegate respondsToSelector:@selector(bbb)];
}

然后其他的[delegate respondsToSelector:@selector(aaa)]或者bbb的地方就直接替换为_delegateHas.aaa或者是_delegateHas.bbb.

上面的aaa与bbb后面的:用到的是C语言的位段.就是说这个无符号int类型的aaa占用了1个二进制位.(所以存储的就是0或者是1,也就是NO或者是YES).举个例子.unsigned int aaa :n;n就代表n个二进制位.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值