一、分類
1、適用範圍
當你已經封裝好了一個類(也可能是系統類、第三方庫),不想在改動這個類了,可是隨着程序功能的增加需要在類中增加一個方法,這時我們不必修改主類,只需要給你原來的類增加一個分類。
將一個大型的類拆分成不同的分類,在不同分類中實現類別聲明的方法,這樣可以將一個類的實現寫到多個.m文件中,方便管理和協同開發。
分類中的方法可以只聲明,不實現,所以在協議不支持可選方法的時候(協議現在已經支持可選方法),通常把分類作爲非正式協議使用。
2、語法格式
文件中的語法
@interface 主類類名(分類類名)
@end
@implementation 主類類名(分類類名)
@end
文件名通常爲:主類名+分類名
調用方法時,只需要向主類引用放送消息即可
3、注意事項
也就是說,在分類中重寫了原來類中的方法,那麼分類中的方法會覆蓋原來類中的方法
- 分類中只能聲明方法,不能添加屬性變量,在運行時分類中的方法與主類中的方法沒有區別
- 通常來講,分類定義在.h文件中,但也可以定義.m文件中,此時分類的方法就變成私有方法
4、如何使用
定義XYZPopViewController類的分類
XYZPopViewController+CatController.h文件
@interfaceXYZPopViewController (CatController)
- (void)test;
@end
XYZPopViewController+CatController.m文件
@implementationXYZPopViewController (CatController)
- (void)test {
NSLog(@"測試一下XYZPopViewController的分類");
}
@end
二、擴展
1、適用範圍
擴展是分類的一種特殊形式。
2、語法格式
@interface 主類類名()
@end
擴展通常定義在主類.m文件中,擴展中聲明的方法直接在主類的.m文件中實現。
3、注意事項
- 擴展中可以聲明實例變量,可以聲明屬性
- 因爲擴展通常定義在主類的.m文件中,所以擴展聲明的方法和屬性通常是私有的
4、分類和擴展的區別
分類是不可以聲明實例變量,通常是公開的,文件名是:主類名+分類名.h
擴展是可以聲明實例變量,是私有的,文件名爲:主類名_擴展標識.h,在主類的.m文件中#import該頭文件
5、如何使用
定義 XYZPopViewController類的擴展
方式1、以單獨的文件定義
XYZPopViewController_ExViewController.h文件
#import"XYZPopViewController.h"
@interfaceXYZPopViewController()
@property(nonatomic,strong)NSString*stringOfEx;
- (void)testEx;
@end
方式2、在主類的.m文件中定義
XYZPopViewController.m文件
#import"XYZPopViewController.h"
@interfaceXYZPopViewController()
@property(nonatomic,strong)NSString*stringOfEx;
- (void)testEx;
@end
@implementationXYZPopViewController
@end
在主類的.m文件中實現擴展定的方法
#import"XYZPopViewController.h"
//import"XYZPopViewController_ExViewController.h"
@interfaceXYZPopViewController()
@implementationXYZPopViewController
- (void)testEx {
self.stringOfEx=@"給擴展裏面定義的屬性字符串賦值";
NSLog(@"定義的屬性String是:%@",self.stringOfEx);
}
三、協議
1、適用範圍
協議用來制定一個規則,一個對象遵守某個協議,就相當於必須遵守它的規則(實現必須實現的方法),也就擁有了一種能力。通常適用協議來實現委託代理模式的傳值和消息發送。
2、語法格式
聲明協議
@protocol 協議名 <>
@required 聲明必須遵守的屬性和方法,默認!
@optional 聲明可選的屬性和方法
@end
一個類遵守一個協議
@interface 類名(分類名):父類名 <協議名>
@end
3、注意事項
- 協議的繼承相當於協議的合併
- 一個類可以同時遵守多個協議,協議之間用","號分開
- 如果一個類遵守一個協議,那麼它的子類也遵守
- 協議的使用和多態相類似,可以用作數組、參數、返回值類型,只不過多態返回的對象,一定要有繼承關係,協議類型返回的對象,一定要有遵守協議或實現協議。
4、如何使用
在一個對象A中定義一個協議類型的引用,讓這個引用指向實現了協議或者遵守了協議的對象B,A對象可以在合適的時候通過這個引用向遵守了協議的對象B發送消息(只能發送協議要求的消息)。由於對象B遵守協議,在B中實現了協議要求的方法,所以當A通過這個協議類型的引用發送消息時,B就會執行這個方法實現的相關操作。
定義一個協議
#import<Foundation/Foundation.h>
@protocolXYZProtocolDelegate <NSObject>
-(void)changedColor:(UIColor *)color;
@end
在對象A中定義一個協議類型的引用
@interfaceXYZPopViewController :UIViewController
@property(nonatomic,weak)id<XYZProtocolDelegate>
delegate;
@end
A對象可以在合適的時候通過這個引用向遵守了協議的對象B發送消息(點擊button發送一個消息)
- (void)buttonClick:(UIButton*)button
{
[self.delegatechangedColor:[UIColoryellowColor]];
}
對象B遵守協議
@interfaceXYZDetailViewController()<XYZProtocolDelegate>
@end
對象B中實現協議要求的方法
- (void)changedColor:(UIColor*)color
{
self.textView.textColor=
color;
}
在對象B中得到對象A的引用,把A中定義的那個協議類型的引用指向自身(一般是在B中創建或者初始化A時)
XYZPopViewController*pVC = [[XYZPopViewControlleralloc]init];
pVC.delegate =self;