美文网首页iOS之性能优化iOS开发
iOS性能优化-位段提高委托模式下的程序效率

iOS性能优化-位段提高委托模式下的程序效率

作者: LeoZzz | 来源:发表于2017-10-26 13:14 被阅读23次

    位段,我相信老牌C语言爱好者,指定很熟悉。它是以位为单位来定义结构体(或联合体)中的成员变量所占的空间。含有位段的结构体称为位段结构。使用位段可以节省空间,提升开发效率。

    在iOS开发中实现委托模式时,如果协议中的方法是可选的,经常需要写代码来判断某个委托对象是否能响应特定的选择子,那么就会出现下列代码:

      if ([_delegate respondsToSelector:@selector(showName:)]) {
            [_delegate showName:@"Joshua"]
        }
    

    但在委托对象本身没变的情况下,如果频繁执行此操作的话,那么除了第一次检测结果是有用之外,后续的检测可能都是多余的。这样可以把委托对象是否能响应某个协议方法这一信息缓存起来,来优化代码执行的效率。
    改进

    #import <Foundation/Foundation.h>
    
    @protocol TestDelegate  <NSObject>
    - (void)showName:(NSString *) name;
    @end
    
    struct  {
        unsigned int showNames : 1;
    }_delegateFlags;
    @interface Test : NSObject
    @property (nonatomic,weak) id <TestDelegate> delegate;
    - (void)log;
    @end
    
    
    #import "Test.h"
    
    @implementation Test
    - (void)setDelegate:(id<TestDelegate>)delegate {
        _delegate = delegate;
        _delegateFlags.showNames = [_delegate respondsToSelector:@selector(showName:)];
    }
    @end
    

    在上述方法中结构体_delegateFlags位段占用1个二进制位,它可以表示0或1这两个值,即真、假。这样的话,每次调用delegate的相关方法之前,就不用检测委托对象是否能响应给定的方法了,而是直接查询结构体里的标识。
    优化后

    if (_delegateFlags.showNames) {
            [_delegate showName:@"123"];
        }
    

    优化前

     if ([_delegate respondsToSelector:@selector(showName:)]) {
            [_delegate showName:@"Joshua"]
        }
    

    在相关代理方法需要调用多次时 可以使用位段来缓存,可以很大的提示开发效率。

    相关文章

      网友评论

      本文标题:iOS性能优化-位段提高委托模式下的程序效率

      本文链接:https://www.haomeiwen.com/subject/iuphpxtx.html