EffectiveOC的学习-5

这里是EffectiveOC的 23 - 28条 ,协议与分类

2016-07-04 | 阅读

23.通过委托与数据源协议进行对象间通信

Java中的接口,在OC中称为协议protocol,OC与Java相似,不支持多继承,但是可以实现多个protocol, 而OC中广泛使用一种称为 委托模式 的设计模式, 主要内容是, 一个对象持有一个protocol实现者,称为委托 delegate,来实现两个对象之间的交互.

对于委托模式,需要注意的几点, A对象上有一个BDelegate,但是A不持有它,而是持有一个弱引用, 因为BDelegate要与A进行交互,可能会持有A对象,所以不能让A对象再持有B,不能形成引用环.

protocol的声明中,使用@optional表示方法是可选得,而默认是@required 表示方法是必选,实现protocol的类必须实现该方法.

除了委托这种说法外,还有一种叫做 数据源dataSource的说法,Cocoa基础库中就常见这种做法,如UITabelView, 通过Data Source来给另外一个对象传递数据.

24. 将类的实现代码分散到便于管理的数个分类之中

通过分类,将不同的方法分在不同的文件中实现,这样可以一定程度上减小文件大小,防止一个UIViewController拥有成千上万行的代码(这种情况很容易出现). 将代码的实现逻辑分在不同的分区,让逻辑看起来更加清晰,利于之后的管理维护.

25.总是为第三方类的分类名称加前缀

Cocoa内基础的类 通过Category添加方法时, 要注意,这些类,如NSString NSArray等,是全局共用的, 添加的分类和方法很容易与其他人产生冲突,所以命名时一定要加上前缀.

26. 在分类中声明属性

除了一种特殊的分类,即extension,能够在分类中添加实例方法, 其他分类中声明属性时,不会添加实例方法,所以需要注意.

分类的缺点就在于不能方便的添加属性,但是我们通过 associate object来实现属性的功能,只是比较麻烦一点.

27. 使用 class-continuation分类 隐藏实现细节

Objective-C中一般称之为 extension 而不是 class-continuation category . extension是一个匿名的Category,只不过有一些表现与普通的category有所不同.

extension声明的方法必须要在类的实现文件中实现,不能分离出一个单独的实现块来实现extension. 最重要的一点是, 它可以声明实例变量. extension是一个匿名category,所以写法一般是:

@interface HelloObject() {

}
@end

extension主要用法就在于声明一些私有的实例变量和方法.

28. 通过协议提供匿名对象

通过协议提供匿名对象,即:

@property (weak) id <XXXDelegate> delegate;

这种匿名属性的声明,我们只知道delegate的属性实现了委托,调用时执行相应的操作,但是这个对象的类型却没有声明,所以隐藏了类名与实现.