1、有时我们想扩展一个类的方法,可以用继承,但继承父类的方法改后对子类也有影响,如果使用OC中的category,就可以很简单的扩展一个类的方法。
2、如何定义category?
例如我们有一个Person类
Person.h
#import@interface Person : NSObject- (void)run;- (void)jump;@end
Person.m
#import "Person.h"@implementation Person- (void)run{ NSLog(@"普通人跑步");}- (void)jump{ NSLog(@"普通人跳跃");}@end
这时我们想扩展这个类,让Person可以fly,把这个分类称为IronMan
Person+IronMan.h
#import "Person.h"@interface Person (IronMan)- (void)fly;@end
Person+IronMan.m
#import "Person+IronMan.h"@implementation Person (IronMan)- (void)fly{ NSLog(@"钢铁侠飞翔中");}@end
3、怎么使用category?
a)在没 import "Person+IronMan.h" 分类时,只能调用原来 Person 的方法。
b)只用import 后才可调用该分类里的方法。
main.m
#import#import "Person.h"#import "Person+IronMan.h"int main(int argc, const char * argv[]){ @autoreleasepool { Person *person = [[Person alloc] init]; [person run]; [person fly]; } return 0;}
当然分类也可以写在原来的Person类里,比如:
Person.h
#import@interface Person : NSObject- (void)run;- (void)jump;@end// Superman@interface Person (Superman)- (void)superRun;@end
4、category注意点
a)类名后面有个冒号代表继承,类名后面有个括号代表分类。
b)category很像java的接口,只能扩展方法,不能扩展类的成员变量。
c)虽然分类里可以重写类的方法,实际就是覆盖,但建议不要重写方法,自己重新写个新的方法较好,避免混乱。
5、categroy常用于系统自动类,当系统自带的类不能满足我们的需求时,我们就需要自己来写
例如,NSString中有很多有用的方法,但我想对它扩展一个 smile 的方法,让字符串笑起来
NSString+Smile.h
#import@interface NSString (Smile)- (void)smile;@end
NSString+Smile.m
#import "NSString+Smile.h"@implementation NSString (Smile)- (void)smile{ NSLog(@"%@ 正在偷笑", self);}@end
main.m
#import#import "NSString+Smile.h"int main(int argc, const char * argv[]){ @autoreleasepool { NSString *str = @"cobish"; [str smile]; } return 0;}