1. 程式人生 > 實用技巧 >oc中分類 擴充套件 協議的使用及區別

oc中分類 擴充套件 協議的使用及區別

>>> hot3.png

一、分類 1、適用範圍 當你已經封裝好了一個類(也可能是系統類、第三方庫),不想在改動這個類了,可是隨著程式功能的增加需要在類中增加一個方法,這時我們不必修改主類,只需要給你原來的類增加一個分類。 將一個大型的類拆分成不同的分類,在不同分類中實現類別宣告的方法,這樣可以將一個類的實現寫到多個.m檔案中,方便管理和協同開發。 分類中的方法可以只宣告,不實現,所以在協議不支援可選方法的時候(協議現在已經支援可選方法),通常把分類作為非正式協議使用。 2、語法格式 檔案中的語法 @interface 主類類名(分類類名)
@end
@implementation主類類名(分類類名) @end 檔名通常為:主類名+分類名 呼叫方法時,只需要向主類引用放送訊息即可 3、注意事項
  • 分類中方法的優先順序比原來類中的方法高
也就是說,在分類中重寫了原來類中的方法,那麼分類中的方法會覆蓋原來類中的方法
  • 分類中只能宣告方法,不能新增屬性變數,在執行時分類中的方法與主類中的方法沒有區別
  • 通常來講,分類定義在.h檔案中,但也可以定義.m檔案中,此時分類的方法就變成私有方法
4、如何使用 定義XYZPopViewController類的分類 XYZPopViewController+CatController.h檔案
@interface
XYZPopViewController (CatController) - ( void )test; @end
XYZPopViewController+CatController.m檔案 @implementation XYZPopViewController (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"
@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、注意事項
  • 協議的繼承相當於協議的合併
  • 一個類可以同時遵守多個協議,協議之間用","號分開
  • 如果一個類遵守一個協議,那麼它的子類也遵守
  • 協議的使用和多型相類似,可以用作陣列、引數、返回值型別,只不過多型返回的物件,一定要有繼承關係,協議型別返回的物件,一定要有遵守協議或實現協議。
4、如何使用 在一個物件A中定義一個協議型別的引用,讓這個引用指向實現了協議或者遵守了協議的物件B,A物件可以在合適的時候通過這個引用向遵守了協議的物件B傳送訊息(只能傳送協議要求的訊息)。由於物件B遵守協議,在B中實現了協議要求的方法,所以當A通過這個協議型別的引用傳送訊息時,B就會執行這個方法實現的相關操作。
定義一個協議 #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