分类又叫类目或者类别
今天咱们详细的讲一下类目,所谓类目就是为已存在的类添加方法,但是不能添加成员变量。
首先为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
说明分类的优先级是高于类本身的方法,但是究竟是哪个分类的优先级高呢,还得看这里,如图所以综上所述
分类的优先级 > 自身类,至于那个分类的优先级高,那就得看先加载哪个分类的.m文件了,唉!