1.Category:無需創建子類就能爲現有的類創建新方法的方式
格式:
#import MyClass.h
@interface MyClass(MyCategory){
-(void)categoryMethod;
}
@end
#import MyClass+MyCategory.h
@implementation MyClass(MyCategory){
-(void)categoryMethod{
NSLog(@"這是分類方法");
}
}
@end</span>
作用:
1.將類的擴展分散到不同的文件中,方便管理;
2.聲明其他類未實現的私有方法,避免編譯器產生警告;
3.向對象添加非正式協議。
使用場景:
1.團隊開發,一個類中的很多方法需由不同的組員實現;
2.擴展基礎類庫中的類,例如:NSString等
侷限性:
1.無法添加實例變量,只能添加方法;
2.當Category中的方法與原始類中的方法同名時,Category的方法優先級更高,原始類中的方法將被覆蓋,無法使用
Category和Extension(類擴展)的區別:
1.從形式上看,Extension是匿名的Category;
2.Extension可添加變量;
3.Extension聲明的方法需要在main implementation中實現,Category可不實現。
2.Protocol:一系列的方法列表,類似於Java的接口
作用:
1.利用protocol實現代理模式,解耦MVC中view和controller。
使用場景:
1.UIView產生的事件通過protocol通知controller。
protocol可以在單獨的h文件中,也可寫在相關類的h文件中
格式:
@protocol XXXDelegate<NSObject>
@required
-(void)requiredMethod; //必須實現的方法,如果不寫註解,默認爲required
@optional
-(void)optionalMethod; //可選方法
@end
//TestDelegate.h
@interface TestDelegate:NSObject<XXXDelegate> //如需採用多個protocol,可用“,”隔開
@end
//TestDelegate.m
@implementation TestDelegate
-(void)requiredMethod{
NSLog(@"protocol的required方法");
}
@end