原文地址:http://ningandjiao.iteye.com/blog/1892359
在Object-C中,提供了一种动态扩展类的方式——Category,它可以动态的为已存在的类添加新的方法,有点类似于Ruby的打开类技术,不同的是Category必须为扩展创建一个新类,新类的名称一般约定为“原类名称+扩展名”。有了这个技术之后,开发者在写代码时就可以从把原始的类设计得非常小,然后在功能增加时再逐步扩展,另外,可以很容易的把新添加的行为模块化。
Category的实现和使用方式非常简单,比方说,在写UI的时候,想使用自己的字体类型和字体大小,这个时候就可以尝试使用Category扩展UIFont支持自己想用的字体和字体大小。首先创建一个Category新类,(UIFont+SnapAdditions.h)
- #import <UIKit/UIKit.h>
- @interface UIFont (SnapAdditions)
- +(id)xnl_snapFontWithSize:(CGFloat)size;
- @end
- #import "UIFont+SnapAdditions.h"
- @implementation UIFont (SnapAdditions)
- +(id)xnl_snapFontWithSize:(CGFloat)size
- {
- return [UIFont fontWithName:@"Action Man" size:size];
- }
- @end
创建好之后,在想使用该方法的类中引入Category类,然后像使用UIFont自身的方法一样使用新的方法就行了。
- #import "UIFont+SnapAdditions.h"
- …
- self.statusLabel.font = [UIFont xnl_snapFontWithSize:16.0f];
- ...
应用场景:
- 想为已有类(自己创建的或者SDK类库)扩展新的方法。
- 多个团队协作时,需要对同一个类进行修改,可以有效隔离相互影响。
注意事项:
- 新创建的Category类不能拥有自己的变量,需要自己的变量可通过继承实现。
- 新创建的Category类会覆盖同名的原类的方法,因此给新方法命名的时候最后特殊一点,避免覆盖原类方法,导致不可预知的错误。
- 新创建的Category类虽然也有“.h”和“.m”文件,但是实现类并不需要实现所有的接口方法,只要不去调用方法就不会有问题。