一、Category概述
用于对已有类新增额外的自定义的方法。
在Objective-C中,给一个类扩展一个其它方法,有两种实现方式:类别和继承。
以下情况必须使用继承。
1.新扩展的方法与原方法同名,但是还需要使用父类的实现。因为使用类别,会覆盖原类的实现,无法访问到原来的方法。
2.扩展类的属性,这个类别无法做到。
继承使用情况:
// ViewControllerEx.h
@interface ViewControllerEx : UIViewController
//自己需要添加的方法
@end
// ViewControllerEx.m
@implementation ViewControllerEx
// 方法的实现
@end
Category是Objective-C语言的一个特性,可以在不改变类名和原来类的实现的前提下,实现对类的方法扩展。
以下情况必须使用Category:
1.针对系统提供的一些类,例如:NSString,NSArray,NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最后使用类别来进行方法扩展。
2.类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简化单个源文件的管理。
Category使用情况:
// 这里有一个约定俗成的规定,类别文件命名时,是原类名+扩展标识名<span style="background-color: rgb(255, 255, 255);">
/</span>/ NSString+ex.h
@interface NSString (ex)
// 扩展的方法
@end
// NSString+ex.m
@implementation NSString (ex)
// 方法的实现
@end
二、Category的使用实例
下面以NSString类为例,新增自定义的翻转字符串的方法。
ReverseString.h
#import <Foundation/Foundation.h>
//对已有类NSString使用Category新增额外自定义的方法
@interface NSString(ReverseString)
-(id)reverseString;
@end
ReverseString.m
#import "ReverseString.h"
@implementation NSString(ReverseString)
-(id)reverseString{
NSUInteger len = [self length];
/*
1.使用字符串对象调用方法.self指字符串本身
2.NSUInteger是无符号数字,即没有负数
*/
NSMutableString *revStr = [NSMutableString stringWithCapacity:len];
while(len >0){
unichar c = [self characterAtIndex:--len];
NSLog(@"c is %C", c);
NSString *newC =[NSString stringWithFormat:@"%C",c];
[revStr appendString:newC];
}
return revStr;
}
@end
Main.m
#import <Foundation/Foundation.h>
#import "ReverseString.h"
#import "Foo.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *str = @"中国你好,hello, china";
NSString *newStr = [str reverseString];
NSLog(@"%@", newStr);
}
return 0;
}
@诗未冷学习博客