分类又叫类目或者类别

今天咱们详细的讲一下类目,所谓类目就是为已存在的类添加方法,但是不能添加成员变量。

首先为NSString添加分类

首先到xcode里面,直接上图



#import <Foundation/Foundation.h>

@interface NSString (module)

- (int)calculationTheNumberOfArabicNumeralsInString;

+ (int)calculationTheNumberOfArabicNumeralsWithString:(NSString *)string;

+ (void)test;

@end

@implementation Person

+ (void)test{

    NSLog(@"Person---test");

}

@end


#import "NSString+module.h"

@implementation NSString (module)

- (int)calculationTheNumberOfArabicNumeralsInString{

    int count = 0;

    for (int i = 0; i < self.length; i++) {

       char a = [self characterAtIndex:i];

        if (a >= '0' && a <= '9') {

            count++;

        }

    }

    return count;

}

+ (int)calculationTheNumberOfArabicNumeralsWithString:(NSString *)string{

    return  [string calculationTheNumberOfArabicNumeralsInString];

}

NSString+module.h里面的module是为工程里面哪个模块添加分类

这样在ViewController.m里面

    NSString *str = @"123flahfho1234567";

    int num = [str calculationTheNumberOfArabicNumeralsInString];

    int num1 = [NSString calculationTheNumberOfArabicNumeralsWithString:str];

    NSLog(@"调用对象方法这个字符串中的阿拉伯数字的个数是%d",num);

    NSLog(@"调用类方法这个字符串中的阿拉伯数字的个数是%d",num1);

    //打印结果如下:

    //    2017-07-13 11:03:47.114 分类又叫类目[65722:826033] 调用对象方法这个字符串中的阿拉伯数字的个数是10

    //    2017-07-13 11:03:53.313 分类又叫类目[65722:826033] 调用类方法这个字符串中的阿拉伯数字的个数是10

到这里就为NSStirng添加了一个分类

但是有的同学可能有疑问,就是类里面的方法和分类里面的方法能不能名字一样?答案是可以方法名相同,但是问题来了,到底是调用哪个同名方法呢以及它们的优先级谁高谁低?好的,下面我们一起来探究一下

首先创建一个继承于NSObject的Person类,并且为里面添加方法:

#import <Foundation/Foundation.h>


@interface Person : NSObject

+ (void)test;

@end

#import "Person.h"


@implementation Person

+ (void)test{

    NSLog(@"Person---test");

}

@end

再为这个类创建两个分类

#import "Person.h"


@interface Person (First)

+ (void)test;

@end


#import "Person+First.h"


@implementation Person (First)

+ (void)test{

    NSLog(@"Person+First.h---test");

}

@end


#import "Person.h"


@interface Person (Second)

+ (void)test;

@end


#import "Person+Second.h"


@implementation Person (Second)

+ (void)test{

    NSLog(@"Person+Second.h---test");

}

@end


这样就创建了两个分类,并且分类里面的方法名是一样的,然后在ViewController.m里面调用

    [Person test];

打印结果如下:

2017-07-13 11:17:20.446 分类又叫类目[65844:832770] Person+Second.h---test

说明分类的优先级是高于类本身的方法,但是究竟是哪个分类的优先级高呢,还得看这里,如图


就是说这两个分类谁在下面就调用谁的方法,也许有的同学会说Person.m放到下面会不会先调用自身的方法呢,答案是:NO。

所以综上所述

    分类的优先级 > 自身类,至于那个分类的优先级高,那就得看先加载哪个分类的.m文件了,唉!