1、有时我们想扩展一个类的方法,可以用继承,但继承父类的方法改后对子类也有影响,如果使用OC中的category,就可以很简单的扩展一个类的方法。
2、如何定义category?
例如我们有一个Person类
Person.h
#import <Foundation/Foundation.h>
@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 <Foundation/Foundation.h>
#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 <Foundation/Foundation.h>
@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 <Foundation/Foundation.h>
@interface NSString (Smile)
- (void)smile;
@end
NSString+Smile.m
#import "NSString+Smile.h"
@implementation NSString (Smile)
- (void)smile
{
NSLog(@"%@ 正在偷笑", self);
}
@end
main.m
#import <Foundation/Foundation.h>
#import "NSString+Smile.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
NSString *str = @"cobish";
[str smile];
}
return 0;
}