天天看點

OC語言--Protocol

一、protocol

協定的基本用途:

*聲明方法,可以聲明一大堆的方法,但不能聲明成員變量;

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

*隻要父類遵守了某個協定,則子類也相當于遵守了該協定。

二、協定格式:

@protocol 協定名稱
方法聲明清單
@end
@property myProtocol
- (void)test;
@end 
           

三、類的協定格式:

@interface 類名:父類 <協定名稱>
//...
@end
@interface Student : Person <myProtocol>    //遵守協定後Student中就有了test方法,在Student的實作中需要将此方法實作
@end
@implementation Student
- (void)test
{
    NSSlog(@"遵守了myProtocol協定");
}
@end
           

四、@protocol關鍵字

*required:要求聲明的方法必須實作

*optional:聲明的方法不要求實作

關鍵字的書寫是為了程式員之間的交流

五、多個協定

@property 協定名稱 <協定名稱1,協定名稱2>
@end

@property myProtocol <protocol1, protocol2>
@end
           

六、遵守協定

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

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

id<協定名稱> 變量名;
NSObject<myProtocol> *obj;
id<myProtocol> obj1;
           

如果沒有遵守對應的協定,編譯器會警告,此時的警告為整條語句的黃色下劃線

2、@property中聲明的屬性也可用做一個遵守協定的限制

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

@property (nonatomic, strong) id<協定名稱> 屬性名;

@property (nonatomic, strong) Dog<myProtocol> *dog;

@property (nonatomic, strong) id<myProtocol> dog2;

七、協定位置:

*協定可定義在單獨的.h檔案中,也可以定義在某個類中;

*如果這個協定隻用在某個類中,則應該把協定寫在該類的.h檔案中;

*如果這個協定可以被多個類使用,則應該把協定寫在單獨的.h檔案中;

八、分類位置:

*分類跟協定一樣,也可以定義在單獨的.h和.m檔案中,也可用定義在原來類中

*一般情況下,都定義在單獨檔案中;

*定義在原來類中的分類,隻需要了解就可以。