1,比如一个类功能太庞大,可以使用category进行分散
2,创建私有方法的前向引用
-例如Person类有一个私有方法
-(void)processStr:(NSString*)str;
在viewDidLoad方法中想要使用Person的这个方法
Person* p = [[Person alloc] init];
[p precoessStr:@"str"];
这样编译不能通过,如果给Person添加了一个分类,并且在分类中声明这个方法,再在viewDidLoad方法的文件中包含这个分类,那么就不会报错,可以正常运行了。
3,添加非正式协议
正式协议需要用@protocol,@required,
@optional,@delegate来规范书写方式,而非正式协议则不需要,只要相应的delegate类直接实现就可以。但是category仅限于NSObject类的分类,不能用它的子类实现非正式协议
如:NSObject+Test分类
-(NSString)inputStr:(NSString)str;这个方法要么在NSObject+Test.m文件中实现,要么在Person.m文件中实现
//NSObject+Test.h
#import <Foundation/Foundation.h>
@interface NSObject (Test)
-(NSString*)inputStr:(NSString*)str;
@end
//NSObject+Test.m文件
#import "NSObject+test.h"
@implementation NSObject (test)
@end
Person类
//Person.h文件
#import <Foundation/Foundation.h>
#import "NSObject+Test.h"
@interface Person : NSString
@end
//Person.m文件
#import "Person.h"
@implementation Person
-(NSString*)inputStr:(NSString*)str
{
if ([str isEqualToString:@"wdc"]) {
return @"ldy";
}
return @"error";
}
@end
在viewcontroller中
- (void)viewDidLoad {
[super viewDidLoad];
Person* p = [[Person alloc] init];
NSString* str = [p inputyouName:@"wdc"];
NSLog(@"%@",str);
}
输出:ldy
category和extension的区别
-0,extension是在运行时决议的,extension在编译时就决议了。
-1,extension是类的一部分,它与头文件的和实现文件一起构成一个完整的类,它一般用来隐藏类的私有信息,而category则不是与原来的类是一个整体,它可以直接添加category,因此它无法向category一样添加extension。
-2,extension可以给类直接添加实例变量,category不可以给一个类添加实例变量(因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的),要通过runtime关联对象来实现。
引用:
美图:http://tech.meituan.com/DiveIntoCategory.html