zoukankan      html  css  js  c++  java
  • 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];  
    }  
    
  • 相关阅读:
    vue向组件传递数据
    微信会员卡,开卡组件开发遇到总汇
    siteserver安装向导完成后,显示System.Web.UI.page render System.ArgumentNullException
    spring mvc中的valid
    django 命名空间详解
    spring MVC 如何查找URL对应的处理类
    【HDU 2010】水仙花数
    【CSU 1079】树上的查询
    【Poj 1330】Nearest Common Ancestors
    【Dairy】2016.10.20 生日记
  • 原文地址:https://www.cnblogs.com/lxlx1798/p/7125641.html
Copyright © 2011-2022 走看看