一、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
下面以NSString类为例,新增自定义的翻转字符串的方法。
ReverseString.h
#import <Foundation/Foundation.h> //对已有类NSString使用Category新增额外自定义的方法 @interface NSString(ReverseString) -(id)reverseString; @end
#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
#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; }
@诗未冷学习博客