`

Object-C中的动态特性Category

 
阅读更多
刚接触Object-C哪会儿,因为名字里带着个“C”以及类名中的“*.h”、“.m”习惯,老觉得Object-C就是一个很古老的东西,不会支持接口,多态之类的特性。其实别人早就提供了,名字不一样而已。不要带着偏见去看待事物,恩恩!

在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”文件,但是实现类并不需要实现所有的接口方法,只要不去调用方法就不会有问题。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics