• OC中如何优化代理是否响应某个方法


    看以下示例代码:

    if([_delegate respondsToSelector:  
        @selector(someClassDidSomething:)){  
        [_delegate someClassDidSomething];  
    }  

    一般情况下,我们在写代理的时候都是这样判断某个对象有没有实现代理中的某个方法。这样固然可以,但是如果某个代理方法调用的频率非常非常高,因为在调用这个代理方法的时候,都需要做一次if判断,if判断的时候又要执行respondsToSelector:方法,所以效率会显得很低下。此时,我们可以采用缓存的办法,来进行优化。

    C语言中有一种乏人问津的特性——可以把结构体中得某个字段在内存中所占用的位数设置为特定的值。

    比如:

    struct data{  
        unsigned int fieldA : 8;  
        unsigned int fieldB : 4;  
        unsigned int fieldC : 2;  
        unsigned int fieldD : 1;  
    };   

    在这个结构体中,fieldA占8位,所以可以表示的范围是0~255,fieldD只占一位,则可以表示的数是0和1。0和1能表示什么,很明显,可以用来表示布尔(BOOL)类型的值。

    现在看优化的代码如下:

    @protocol EOCNetworkFetcherDelegate  
      
    @optional  
    -(void)networkFetcher:(EOCNetworkFetcher *)fetcher didReceiveData:(NSData *)data;  
    -(void)networkFetcher:(EOCNetworkFetcher *)fetcher didFailError:(NSError *)error;  
    -(void)networkFetcher:(EOCNetworkFetcher *)fetcher didUpdateProgressTo:(float)progress;  
      
    @end  

    优化代码:

    @interface EOCNetworkFetcher(){  
        struct{  
            unsigned int didReceiveData : 1;  
            unsigned int didReceiveData : 1;  
            unsigned int didReceiveData : 1;  
        } _delegateFlags;  
    }  
    @end  
    

    在setDelegate中,可以写以下代码,来优化:

    -(void)setDelegate:(id<EOCNetworkFetcher>)delegate{  
        _delegate = delegate;  
        _delegateFlags.didReceiveData =[delegate respondsToSelector:@selector(networkFetcher:didReceiveData:)];  
        _delegateFlags.didFailWithError =[delegate respondsToSelector:@selector(networkFetcher:didFailWithError:)];  
        _delegateFlags.didUpdateProgressTo =[delegate respondsToSelector:@selector(networkFetcher:didUpdateProgressTo:)];  
    }   

    在设置完delegate以后,就可以采用_delegateFlags中的具体标志而不需要每次都调用respondsToSelector:来判断是否响应了某个方法。

    if(_delegateFlags.didUpdateProgressTo){  
        [_delegate networkFetcher:self didUpdateProgressTo:currentProgress];  
    }  
    
  • 相关阅读:
    AFO以后的机房游记
    THUSC2019 退役记
    最小树形图模板
    Codeforces Round #618 (Div. 2)
    「CF662C」 Binary Table
    「SCOI2012」喵星球上的点名
    P4480 「BJWC2018」「网络流与线性规划24题」餐巾计划问题
    CSP-S 2019 游记
    「BZOJ2839」集合计数
    「SPOJ 3105」Power Modulo Inverted
  • 原文地址:https://www.cnblogs.com/lxlx1798/p/7125641.html
Copyright © 2020-2023  润新知