iOS之性能优化iOS开发

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

2017-10-26  本文已影响23人  LeoZzz

位段,我相信老牌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"]
    }

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

上一篇 下一篇

猜你喜欢

热点阅读