Object-C中的动态特性(Category类别)

原文地址:http://ningandjiao.iteye.com/blog/1892359


在Object-C中,提供了一种动态扩展类的方式——Category,它可以动态的为已存在的类添加新的方法,有点类似于Ruby的打开类技术,不同的是Category必须为扩展创建一个新类,新类的名称一般约定为“原类名称+扩展名”。有了这个技术之后,开发者在写代码时就可以从把原始的类设计得非常小,然后在功能增加时再逐步扩展,另外,可以很容易的把新添加的行为模块化。 

Category的实现和使用方式非常简单,比方说,在写UI的时候,想使用自己的字体类型和字体大小,这个时候就可以尝试使用Category扩展UIFont支持自己想用的字体和字体大小。首先创建一个Category新类,(UIFont+SnapAdditions.h) 

Object-c代码  收藏代码
  1. #import <UIKit/UIKit.h>  
  2. @interface UIFont (SnapAdditions)  
  3.   
  4. +(id)xnl_snapFontWithSize:(CGFloat)size;  
  5.   
  6. @end  

Object-c代码  收藏代码
  1. #import "UIFont+SnapAdditions.h"  
  2.   
  3. @implementation UIFont (SnapAdditions)  
  4.   
  5. +(id)xnl_snapFontWithSize:(CGFloat)size  
  6. {  
  7.     return [UIFont fontWithName:@"Action Man" size:size];  
  8. }  
  9. @end  

创建好之后,在想使用该方法的类中引入Category类,然后像使用UIFont自身的方法一样使用新的方法就行了。 
Object-c代码  收藏代码
  1. #import "UIFont+SnapAdditions.h"  
  2. …  
  3. self.statusLabel.font = [UIFont xnl_snapFontWithSize:16.0f];  
  4. ...  

应用场景: 
  • 想为已有类(自己创建的或者SDK类库)扩展新的方法。
  • 多个团队协作时,需要对同一个类进行修改,可以有效隔离相互影响。

注意事项: 
  • 新创建的Category类不能拥有自己的变量,需要自己的变量可通过继承实现。
  • 新创建的Category类会覆盖同名的原类的方法,因此给新方法命名的时候最后特殊一点,避免覆盖原类方法,导致不可预知的错误。
  • 新创建的Category类虽然也有“.h”和“.m”文件,但是实现类并不需要实现所有的接口方法,只要不去调用方法就不会有问题。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章