分类:category

分类category :也叫类别,可以动态的为某个类增加一些方法,拓展这个类,能够方便团队开发,分类可以在你即使不知道一个类的源码的情况下,也可以向这个类添加扩展的方法,但是分类无法向类中添加新的成员变量,分类没有位置容纳成员变量(可以使用字典对象解决);

1:分类声明

//声明
@interface 类名<分类名称>

@end

//实现
@implemention 类名(分类名称)

@end

2:分类创建  NewFile-Objective-C File - Category


在Person中添加扩展方法run ,扩展类名称为:action 

Person+action.h

#import "Person.h"

@interface Person (action)

-(void)run;
@end
Person+action.m

#import "Person+action.h"

@implementation Person (action)
-(void)run{
    NSLog(@"某人跑了起来。。。");
}
@end
main.m

#import <Foundation/Foundation.h>
#import "Person+action.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p =[[Person alloc]init];
        [p run];    
    }
    return 0;
}
注意:如果Category增加的方法如果与类的方法同名,会覆盖原类中的方法,因为Category具有更高的优先级;
例如Person.m 中有run方法:

#import "Person.h"

@implementation Person
-(void)run{
    NSLog(@"跑跑");
}
@end
代码执行情况为:

3:也可以向系统固有的数据类型进行动态添加方法:比如向NSString的方法中添加计阿拉伯数字个数的方法;

Nsstring+Number.m

#import "NSString+Number.h"

@implementation NSString (Number)
-(int)numberOfWords{
    int count =0;
    /*
     不建议这样写,i=self.length 每次都会调用get方法,增加系统开销,所以将其提取出来
     for(int i=0;i<self.length;i++)
     */
    long len = self.length;
    for(int i=0;i<len;i++)
    {
        //获取i位置对应的字符
        char c = [self characterAtIndex:i];
        if(c>='0' && c<='9')
        {
            count ++;
        }
    }
    return count;

}
@end
main.m

#import <Foundation/Foundation.h>
#import "Person+action.h"
#import "NSString+Number.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Person *p =[[Person alloc]init];
        [p run];
        NSString *str =@"1234546dksjfkdfj";
        int num = [str numberOfWords];
        NSLog(@"字符串中数字的个数为%d",num);
    }
    return 0;
}
代码运行情况:



注意:Category 中的方法必须声明并且实现,如果不声明,编译器将会报错(和类扩展不同)
比如在Nsstring+Number.h 中没有声明numberOfwords方法,编译器会报如下错误:






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值