总结
1、通过委托与数据源协议进行对象间通信
当某对象需要从另外一个对象中获取数据时,可以使用委托模式,也称“数据源协议”。若有必要,可实现含有位段的结构体,将委托对象是否响应相关协议方法这一信息缓存至其中。
struct data {
unsigned int didReceiveData : 1;
unsigned int didFailWithError : 1;
unsigned int didUpdateProgressTo : 1;
} _delegateFlags;
实现缓存功能所用的代码可以写在delegate属性所对应的设置方法里:
- (void)setDelegate:(id<EOCNetworkFetcher>)delegate {
_delegate = delegate;
_delegateFlags.didReceiveData = [delegate respondsToSelector:@selector(networkFethcer:didReceiveData:)];
_delegateFlags.didFailWithError = [delegate respondsToSelector:@selector(networkFethcer:didFailWithError:)];
_delegateFlags.didUpdateProgressTo = [delegate respondsToSelector:@selector(networkFethcer:didUpdateProgressTo:)];
}
这样,每次调用delegate的相关方法之前就不用检测委托对象是否响应给定的选择子了,而是直接查询结构体里的标志:
if (_delegateFlags.didUpdateProgressTo) {
[_delegate networkFethcer:self didUpdateProgressTo:currentProgress];
}
在相关方法要调用很多次时,值得进行这种优化。
2、将类的实现代码分散到便于管理的数个分类之中
1、使用分类机制把类的实现代码划分成易于管理的小块;
2、将应该视为“私有”的方法归入名为Private的分类中,以隐藏实现细节。
3、使用场景:
(1)、扩展已有的类;
(2)、引用父类未公开方法;
(3)、实现简单协议。
【注】一般类别中的方法需要加上前缀,避免名称冲突,防止方法被覆盖。
4、向第三方类中添加分类时,总应给其名称加上你专用的前缀,也总应给其中的方法名加上你专用的前缀。
5、勿在分类中声明属性,把封装数据所有的全部属性都定义在主接口里,在分类中只定义方法。
3、使用“class-continuation 分类” 隐藏实现细节
(即类本身的一个分类)如:EOCPerson.m 文件
@interface EOCPerson ()
{
NSString * _anInstanceVariable;
}
@end
@implementation EOCPerson
@end
1、通过“class-continuation 分类”向类中新增实例变量;
2、若某属性在主接口中声明为“只读”,而类的内部又要用设置方法修改此属性,那么就在“class-continuation 分类”中将其扩展为“可读写”;
3、把私有方法的原型和协议声明在“class-continuation 分类”里面。