oc中分類 擴展 協議的使用及區別

1、分類
     一、適用範圍
     當你已經封裝好了一個類(也多是系統類、第三方庫),不想在改動這個類了,但是隨着程序功能的增長鬚要在類中增長一個方法,這時咱們沒必要修改主類,只須要給你原來的類增長一個分類。
     將一個大型的類拆分紅不一樣的分類,在不一樣分類中實現類別聲明的方法,這樣能夠將一個類的實現寫到多個.m文件中,方便管理和協同開發。
     分類中的方法能夠只聲明,不實現,因此在協議不支持可選方法的時候(協議如今已經支持可選方法),一般把分類做爲非正式協議使用。
     二、語法格式
    文件中的語法
      @interface 主類類名(分類類名)
      @end
     @implementation 主類類名(分類類名)
      @end
     文件名一般爲:主類名+分類名
     調用方法時,只須要向主類引用放送消息便可
    三、注意事項
  • 分類中方法的優先級比原來類中的方法高
     也就是說,在分類中重寫了原來類中的方法,那麼分類中的方法會覆蓋原來類中的方法
  • 分類中只能聲明方法,不能添加屬性變量,在運行時分類中的方法與主類中的方法沒有區別
  • 一般來說,分類定義在.h文件中,但也能夠定義.m文件中,此時分類的方法就變成私有方法  
     四、如何使用
定義XYZPopViewController類的分類
XYZPopViewController+CatController.h文件
@interface XYZPopViewController (CatController)
- ( void )test;
@end

XYZPopViewController+CatController.m文件
@implementation XYZPopViewController (CatController)
- (void)test {
    NSLog ( @" 測試一下 XYZPopViewController 的分類 " );
}
@end

2、擴展
    一、適用範圍
     擴展是分類的一種特殊形式。
     二、語法格式
     @interface 主類類名()
     @end
     擴展一般定義在主類.m文件中,擴展中聲明的方法直接在主類的.m文件中實現。
    三、注意事項
  • 擴展中能夠聲明實例變量,能夠聲明屬性
  • 由於擴展一般定義在主類的.m文件中,因此擴展聲明的方法和屬性一般是私有的
     四、分類和擴展的區別
     分類是不能夠聲明實例變量,一般是公開的,文件名是:主類名+分類名.h
     擴展是能夠聲明實例變量,是私有的,文件名爲:主類名_擴展標識.h,在主類的.m文件中#import該頭文件
     五、如何使用
定義 XYZPopViewController類的擴展
方式一、以單獨的文件定義
XYZPopViewController_ExViewController.h文件
#import "XYZPopViewController.h"

@interface XYZPopViewController ()
@property ( nonatomic , strong ) NSString *stringOfEx;
- ( void )testEx;
@end

方式二、在主類的.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


3、協議
     一、適用範圍
     協議用來制定一個規則,一個對象遵照某個協議,就至關於必須遵照它的規則(實現必須實現的方法),也就擁有了一種能力。一般適用協議來實現委託代理模式的傳值和消息發送。
     二、語法格式
    聲明協議
     @protocol 協議名 <>
           @required 聲明必須遵照的屬性和方法,默認!
           @optional 聲明可選的屬性和方法
     @end
     一個類遵照一個協議
     @interface 類名(分類名):父類名 <協議名>
     @end
     三、注意事項
  •  協議的繼承至關於協議的合併
  •  一個類能夠同時遵照多個協議,協議之間用","號分開
  • 若是一個類遵照一個協議,那麼它的子類也遵照
  • 協議的使用和多態相相似,能夠用做數組、參數、返回值類型,只不過多態返回的對象,必定要有繼承關係,協議類型返回的對象,必定要有遵照協議或實現協議。
     四、如何使用
          在一個對象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
相關文章
相關標籤/搜索