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"]
}
三
在相关代理方法需要调用多次时 可以使用位段来缓存,可以很大的提示开发效率。