1阱扬,比如一個(gè)類功能太龐大另玖,可以使用category進(jìn)行分散
2袁串,創(chuàng)建私有方法的前向引用
-例如Person類有一個(gè)私有方法
-(void)processStr:(NSString*)str;
在viewDidLoad方法中想要使用Person的這個(gè)方法
Person* p = [[Person alloc] init];
[p precoessStr:@"str"];
這樣編譯不能通過(guò)刨沦,如果給Person添加了一個(gè)分類鸠真,并且在分類中聲明這個(gè)方法悯仙,再在viewDidLoad方法的文件中包含這個(gè)分類,那么就不會(huì)報(bào)錯(cuò)吠卷,可以正常運(yùn)行了锡垄。
3,添加非正式協(xié)議
正式協(xié)議需要用@protocol祭隔,@required货岭,
@optional,@delegate來(lái)規(guī)范書寫方式疾渴,而非正式協(xié)議則不需要千贯,只要相應(yīng)的delegate類直接實(shí)現(xiàn)就可以。但是category僅限于NSObject類的分類搞坝,不能用它的子類實(shí)現(xiàn)非正式協(xié)議
如:NSObject+Test分類
-(NSString)inputStr:(NSString)str;這個(gè)方法要么在NSObject+Test.m文件中實(shí)現(xiàn)搔谴,要么在Person.m文件中實(shí)現(xiàn)
//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的區(qū)別
-0,extension是在運(yùn)行時(shí)決議的桩撮,extension在編譯時(shí)就決議了敦第。
-1,extension是類的一部分店量,它與頭文件的和實(shí)現(xiàn)文件一起構(gòu)成一個(gè)完整的類芜果,它一般用來(lái)隱藏類的私有信息,而category則不是與原來(lái)的類是一個(gè)整體融师,它可以直接添加category右钾,因此它無(wú)法向category一樣添加extension。
-2,extension可以給類直接添加實(shí)例變量舀射,category不可以給一個(gè)類添加實(shí)例變量(因?yàn)樵谶\(yùn)行期灭将,對(duì)象的內(nèi)存布局已經(jīng)確定,如果添加實(shí)例變量就會(huì)破壞類的內(nèi)部布局后控,這對(duì)編譯型語(yǔ)言來(lái)說(shuō)是災(zāi)難性的)庙曙,要通過(guò)runtime關(guān)聯(lián)對(duì)象來(lái)實(shí)現(xiàn)。
引用:
美圖:http://tech.meituan.com/DiveIntoCategory.html