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

    172225_zLe7_1444783.png

    172319_Je46_1444783.png

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

    173833_3855_1444783.png

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





转载于:https://my.oschina.net/cobish/blog/355113

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值