p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 18.0px; font: 18.0px 'Lucida Grande'} p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 18.0px; font: 12.0px 'Lucida Grande'; color: #6b94b9; min-height: 15.0px} p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 18.0px; font: 9.0px 'Lucida Grande'; color: #888888; background-color: #6b94b9} p.p4 {margin: 0.0px 0.0px 10.0px 0.0px; line-height: 23.0px; font: 14.0px 'Lucida Grande'} p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; text-align: right; line-height: 15.0px; font: 12.0px Courier; color: #808080} p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 12.0px Courier; color: #6e371b} p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 12.0px Courier; color: #110000} p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 12.0px Courier; color: #a61390} p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 15.0px; font: 12.0px Courier; color: #bf1d1a} p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; line-height: 18.0px; font: 12.0px 'Lucida Grande'; color: #989898} span.s1 {color: #110000} span.s2 {color: #a61390} span.s3 {color: #022201} span.s4 {color: #400580} span.s5 {color: #bf1d1a} span.s6 {color: #6b94b9} table.t1 {border-collapse: collapse} td.td1 {width: 14.0px; background-color: #ddeeff; padding: 2.0px 4.0px 2.0px 4.0px} td.td2 {width: 259.0px; padding: 2.0px 4.0px 2.0px 4.0px} td.td3 {width: 308.0px; padding: 2.0px 4.0px 2.0px 4.0px} td.td4 {width: 7.0px; background-color: #ddeeff; padding: 2.0px 4.0px 2.0px 4.0px} td.td5 {width: 280.0px; padding: 2.0px 4.0px 2.0px 4.0px} td.td6 {width: 336.0px; padding: 2.0px 4.0px 2.0px 4.0px}
Objective-C使用Category
CategoryCocoaiOSiOS入门Objective-c
Category是ObjC语言中的扩展机制之一,另一个为Protocol。
Category提供一种为某个类添加方法而又不必编写子类的途径。
假设有这样一个类CarInfo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #import <Foundation/Foundation.h>
@interface CarInfo : NSObject {
}
-(void)sayCarBrand;
@end
@implementation CarInfo
-(void) sayCarBrand{ NSLog(@"Car brand: Golf"); }
@end |
我可以用Category为该类增加新的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #import <Foundation/Foundation.h> #import "CarInfo.h"
@interface CarInfo(CarInfoCategory)
-(void)sayCarBrandChinese;
@end
@implementation CarInfo(CarInfoCategory)
-(void)sayCarBrandChinese{ NSLog(@"汽车品牌:高尔夫"); }
@end |
这里的Category增加了一个新的方法,用来显示汉字名称。可在其他代码中直接调用,就如同调用CarInfo其他实例方法一样:
1 2 | CarInfo *carInfo=[[CarInfo alloc] init]; [carInfo sayCarBrandChinese]; |
这种效果是Java做不到的。这得益于ObjC语言方法调度程序这一特殊机制。
如果方法名称相同会怎样?比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #import <Foundation/Foundation.h> #import "CarInfo.h"
@interface CarInfo(CarInfoCategory)
-(void)sayCarBrand;
@end
@implementation CarInfo(CarInfoCategory)
-(void)sayCarBrand{ NSLog(@"汽车品牌:高尔夫"); }
@end |
再次调用:
1 2 | CarInfo *carInfo=[[CarInfo alloc] init]; [carInfo sayCarBrand]; |
会发现,打印的是category中的方法,而不是类的实例方法。因为category优先于类实例方法。
那么是否有这样的能力,比如在category的方法内代码中调用类的实例方法,这样不就可以实现类似Java方法拦截器的功能了么?或者说是方法代理模式。遗憾的是,这样不可以。
原文链接:http://marshal.easymorse.com/archives/4183
转载编辑: Fgamers
转载地址:http://disanji.net/2011/05/17/objective-c-use-category/