11、OC —— Category

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

    11、OC —— Category_第1张图片

    11、OC —— Category_第2张图片

    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 的方法,让字符串笑起来

    11、OC —— Category_第3张图片

    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;
}





你可能感兴趣的:(11、OC —— Category)