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];  
    }  
    
  • 相关阅读:
    eclipse中误删tomcat后,文件都报错,恢复server时无法选择tomcat7.0解决办法
    java web多组件协作实现用户登录验证
    设计模式--享元模式
    设计模式--中介者模式
    设计模式--职责链模式
    设计模式--观察者模式与命令模式
    设计模式--桥接模式
    设计模式--迭代器模式
    设计模式--组合模式
    设计模式--备忘录模式
  • 原文地址:https://www.cnblogs.com/lxlx1798/p/7125641.html
Copyright © 2011-2022 走看看