天天看點

黑馬程式員——IOS基礎——Protocol協定

------- android教育訓練、java教育訓練、期待與您交流!

MyProtocal1.h://這是協定類

#import <Foundation/Foundation.h>
@protocol MyProtocol1 <NSObject> //這是基協定,一定要遵守
@required //預設required,必須要實作
- (void)test1;
- (void)test2;
@optional //可選實作
- (void)test3;
@end
           

MyProtocal2.h://這是協定類

#import <Foundation/Foundation.h>
@protocol MyProtocol2
- (void)haha2;
@optional
- (void)haha3;
@end
           

隻要一個類遵守了一份協定,就能擁有這份協定中的所有方法聲明

協定不能寫實作,僅僅添加方法聲明

協定和分類一樣,不能寫成員變量

 : 繼承父類

 <> 遵守協定

Person.h:

#import <Foundation/Foundation.h>
#import "MyProtocol1.h"
#import "MyProtocol2.h"
@interface Person : NSObject <MyProtocol1,MyProtocol2> //類似java中的接口,OC也可以實作多個協定
@end
           

基本用途:

>可以聲明一堆方法,單不能聲明成員變量

>隻要某個類遵守了這個協定,就相當于擁有這個協定中的所有方法聲明

>隻要父類遵守了某個協定,就相當于子類也遵守了

>用于代理模式和觀察者模式

>一個協定可以遵守另一個協定:

@protocol MyProtocol2 <MyProtocol1>
- (void)haha;
@end
           

1.協定的定義:

@protocol 協定名稱 <NSObject>

//方法聲明清單

@end

2.如何遵守協定

>類遵守協定:

@interface 類名 : 父類名 <協定名稱1,協定名稱2>

@end

>協定遵守協定

@protocol 協定名稱 <其他協定名稱1,其他協定名稱2>

@end

3.協定中方法聲明的關鍵字

>@required(預設) :要求實作聲明此關鍵字的方法,如果沒有實作,會發出警告

>@optional : 可選實作,不會有警告

4.定義一個變量的時候,限制這個變量儲存的對象遵守某個協定

類名<協定名稱> *變量名

id<協定名稱> 變量名

NSObject<MyProtocol> *obj;

id<MyProtocol>obj2;

[email protected]中聲明的屬性也可用做一個遵守協定的限制

@property (nonatomic, strong) 類名<協定名稱> *屬性名

@property (nonatomic, strong) id<協定名稱> 屬性名    //id就相當于   類名*

6.協定可以定義在單獨.h檔案中,也可以定義在某一類中

>如果這個協定隻用在某個類中,應該把協定定義在該類中

>若果這個協定用在很多類中,就應該定義在單獨檔案中

7.分類可以定義在單獨.h和.m檔案中,也可以定義在原來類中

>一般情況下,都是定義在單獨檔案

>定義在原來類中的分類,隻要求能看懂文法

------- android教育訓練、java教育訓練、期待與您交流!