oc中分類 擴充套件 協議的使用及區別
阿新 • • 發佈:2020-10-09
一、分類
1、適用範圍
當你已經封裝好了一個類(也可能是系統類、第三方庫),不想在改動這個類了,可是隨著程式功能的增加需要在類中增加一個方法,這時我們不必修改主類,只需要給你原來的類增加一個分類。
將一個大型的類拆分成不同的分類,在不同分類中實現類別宣告的方法,這樣可以將一個類的實現寫到多個.m檔案中,方便管理和協同開發。
分類中的方法可以只宣告,不實現,所以在協議不支援可選方法的時候(協議現在已經支援可選方法),通常把分類作為非正式協議使用。
2、語法格式
檔案中的語法
@interface 主類類名(分類類名)
@end
@implementation主類類名(分類類名)
@end
檔名通常為:主類名+分類名
呼叫方法時,只需要向主類引用放送訊息即可
3、注意事項
@interface
XYZPopViewController (CatController)
- (
void
)test;
@end
XYZPopViewController+CatController.m檔案 @implementation XYZPopViewController (CatController) - (void)test { NSLog ( @" 測試一下 XYZPopViewController 的分類 " );
} @end
二、擴充套件 1、適用範圍 擴充套件是分類的一種特殊形式。 2、語法格式 @interface 主類類名() @end 擴充套件通常定義在主類.m檔案中,擴充套件中宣告的方法直接在主類的.m檔案中實現。 3、注意事項
@interface XYZPopViewController () @property ( nonatomic , strong ) NSString *stringOfEx; - ( void )testEx;
@end
方式2、在主類的.m檔案中定義 XYZPopViewController.m檔案
#import "XYZPopViewController.h"
@interface XYZPopViewController () @property ( nonatomic , strong ) NSString *stringOfEx; - ( void )testEx; @end
@implementation XYZPopViewController @end
在主類的.m檔案中實現擴充套件定的方法 #import "XYZPopViewController.h" //import"XYZPopViewController_ExViewController.h"
@interface XYZPopViewController ()
@end
@implementation XYZPopViewController - ( void )testEx {
self . stringOfEx = @" 給擴充套件裡面定義的屬性字串賦值 " ;
NSLog ( @" 定義的屬性 String 是 :%@" , self .stringOfEx); } @end
三、協議 1、適用範圍 協議用來制定一個規則,一個物件遵守某個協議,就相當於必須遵守它的規則(實現必須實現的方法),也就擁有了一種能力。通常適用協議來實現委託代理模式的傳值和訊息傳送。 2、語法格式 宣告協議 @protocol 協議名 <> @required 宣告必須遵守的屬性和方法,預設! @optional 宣告可選的屬性和方法 @end 一個類遵守一個協議 @interface 類名(分類名):父類名 <協議名> @end 3、注意事項
定義一個協議 #import <Foundation/Foundation.h>
@protocol XYZProtocolDelegate < NSObject > -(void)changedColor:(UIColor *)color; @end
在物件A中定義一個協議型別的引用
@interface XYZPopViewController : UIViewController
@property ( nonatomic , weak ) id < XYZProtocolDelegate > delegate; @end A物件可以在合適的時候通過這個引用向遵守了協議的物件B傳送訊息(點選button傳送一個訊息)
- ( void )buttonClick:( UIButton *)button { [ self . delegate changedColor :[ UIColor yellowColor ]]; } 物件B遵守協議
@interface XYZDetailViewController ()< XYZProtocolDelegate >
@end 物件B中實現協議要求的方法
- ( void )changedColor:( UIColor *)color {
self . textView . textColor = color; } 在物件B中得到物件A的引用,把A中定義的那個協議型別的引用指向自身(一般是在B中建立或者初始化A時) XYZPopViewController *pVC = [[ XYZPopViewController alloc ] init ]; pVC.delegate =self;
- 分類中方法的優先順序比原來類中的方法高
- 分類中只能宣告方法,不能新增屬性變數,在執行時分類中的方法與主類中的方法沒有區別
- 通常來講,分類定義在.h檔案中,但也可以定義.m檔案中,此時分類的方法就變成私有方法
XYZPopViewController+CatController.m檔案 @implementation XYZPopViewController (CatController) - (void)test { NSLog ( @" 測試一下 XYZPopViewController 的分類 " );
} @end
二、擴充套件 1、適用範圍 擴充套件是分類的一種特殊形式。 2、語法格式 @interface 主類類名() @end 擴充套件通常定義在主類.m檔案中,擴充套件中宣告的方法直接在主類的.m檔案中實現。 3、注意事項
- 擴充套件中可以宣告例項變數,可以宣告屬性
- 因為擴充套件通常定義在主類的.m檔案中,所以擴充套件宣告的方法和屬性通常是私有的
@interface XYZPopViewController () @property ( nonatomic , strong ) NSString *stringOfEx; - ( void )testEx;
@end
方式2、在主類的.m檔案中定義 XYZPopViewController.m檔案
#import "XYZPopViewController.h"
@interface XYZPopViewController () @property ( nonatomic , strong ) NSString *stringOfEx; - ( void )testEx; @end
@implementation XYZPopViewController @end
在主類的.m檔案中實現擴充套件定的方法 #import "XYZPopViewController.h" //import"XYZPopViewController_ExViewController.h"
@interface XYZPopViewController ()
@end
@implementation XYZPopViewController - ( void )testEx {
self . stringOfEx = @" 給擴充套件裡面定義的屬性字串賦值 " ;
NSLog ( @" 定義的屬性 String 是 :%@" , self .stringOfEx); } @end
三、協議 1、適用範圍 協議用來制定一個規則,一個物件遵守某個協議,就相當於必須遵守它的規則(實現必須實現的方法),也就擁有了一種能力。通常適用協議來實現委託代理模式的傳值和訊息傳送。 2、語法格式 宣告協議 @protocol 協議名 <> @required 宣告必須遵守的屬性和方法,預設! @optional 宣告可選的屬性和方法 @end 一個類遵守一個協議 @interface 類名(分類名):父類名 <協議名> @end 3、注意事項
- 協議的繼承相當於協議的合併
- 一個類可以同時遵守多個協議,協議之間用","號分開
- 如果一個類遵守一個協議,那麼它的子類也遵守
- 協議的使用和多型相類似,可以用作陣列、引數、返回值型別,只不過多型返回的物件,一定要有繼承關係,協議型別返回的物件,一定要有遵守協議或實現協議。
定義一個協議 #import <Foundation/Foundation.h>
@protocol XYZProtocolDelegate < NSObject > -(void)changedColor:(UIColor *)color; @end
在物件A中定義一個協議型別的引用
@interface XYZPopViewController : UIViewController
@property ( nonatomic , weak ) id < XYZProtocolDelegate > delegate; @end A物件可以在合適的時候通過這個引用向遵守了協議的物件B傳送訊息(點選button傳送一個訊息)
- ( void )buttonClick:( UIButton *)button { [ self . delegate changedColor :[ UIColor yellowColor ]]; } 物件B遵守協議
@interface XYZDetailViewController ()< XYZProtocolDelegate >
@end 物件B中實現協議要求的方法
- ( void )changedColor:( UIColor *)color {
self . textView . textColor = color; } 在物件B中得到物件A的引用,把A中定義的那個協議型別的引用指向自身(一般是在B中建立或者初始化A時) XYZPopViewController *pVC = [[ XYZPopViewController alloc ] init ]; pVC.delegate =self;
轉載於:https://my.oschina.net/bobooo/blog/384880