Object C的Categories

来源:互联网 发布:linux 文件读写 c程序 编辑:程序博客网 时间:2024/05/16 18:41

Category提供一种为某个类添加方法而又不必编写子类的途径。

假设有这样一个类CarInfo:

 
 #import <Foundation/Foundation.h>   @interface CarInfo : NSObject {   }   -(void)sayCarBrand;   @end    @implementation CarInfo  -(void) sayCarBrand{ NSLog(@"Car brand: Golf"); }    @end 

我可以用Category为该类增加新的方法:

 
 #import <Foundation/Foundation.h>  #import "CarInfo.h"    @interface CarInfo(CarInfoCategory)    -(void)sayCarBrandChinese;    @end         @implementation CarInfo(CarInfoCategory)   -(void)sayCarBrandChinese{ NSLog(@"汽车品牌:高尔夫"); }    @end 

这里的Category增加了一个新的方法,用来显示汉字名称。可在其他代码中直接调用,就如同调用CarInfo其他实例方法一样:

CarInfo *carInfo=[[CarInfo alloc] init][carInfo sayCarBrandChinese];

这种效果是Java做不到的。这得益于ObjC语言方法调度程序这一特殊机制。

如果方法名称相同会怎样?比如:

 #import <Foundation/Foundation.h> #import "CarInfo.h"    @interface CarInfo(CarInfoCategory)   -(void)sayCarBrand;   @end    @implementation CarInfo(CarInfoCategory)   -(void)sayCarBrand{ NSLog(@"汽车品牌:高尔夫"); }   @end 

再次调用:

CarInfo *carInfo=[[CarInfo alloc] init]; [carInfo sayCarBrand];

会发现,打印的是category中的方法,而不是类的实例方法。因为category优先于类实例方法。

0 0
原创粉丝点击