在前一篇文章中咱們介紹了OC中類的延展:http://blog.csdn.net/jiangwei0910410003/article/details/41775603,這一篇文章咱們在來看一下OC中協議的概念以及用法,協議也是OC中的一個重點,Foundation框架以及咱們後面在寫代碼都會用到。框架
OC中的協議就是至關於Java中的接口(抽象類),只不過OC中的名字更形象點,由於咱們在學習Java中的接口時候,看能夠知道其實接口就至關於一種契約(協議),給他的實現類打上標記了,固然這個活在Java5.0以後,被註解替代了,由於註解就是爲了此功能誕生的。學習
協議就是定義了一組方法,而後讓其餘類去實現測試
下面來看代碼:ui
WithProtocol.hspa
// // WithProtocol.h // 11_ProtocolDemo // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> @protocol WithProtocol <NSObject> //默認是必須實現的 //必須實現 @required - (void)finshTask; - (void)dontLate; //可選實現 @optional - (void)wearNeat; @end這裏就定義了一個協議WithProtocl
協議的定義格式:.net
@protocol 協議名 <父協議>code
定義方法對象
@endblog
注:定義協議的關鍵字是@protocol,同時協議也是能夠繼承父協議的繼承
協議中定義的方法還有兩個修飾符:
@required:這個表示這個方法是其餘類必須實現的,也是默認的值
@optional:這個表示這個方法對於其餘類實現是可選的
這個就和相似與Java中的抽象類了,若是是abstract修飾的就必須實現,因此若是一個協議中沒有@optional修飾的方法,那麼這個協議就至關於Java中的接口了。
這裏要注意的是,上面的代碼中NSObject不是咱們以前說的NSObject類了,而是NSObject協議,他也是OC中第一個協議,這個名字相同在OC中是沒有關係的。
再看一下協議的使用:
Student.h
// // Student.h // 11_ProtocolDemo // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> #import "WithProtocol.h" @interface Student : NSObject <WithProtocol> - (void)study; @end使用協議很簡單, 直接在繼承類(NSObject)後面 <協議名>便可
Student.m
// // Student.m // 11_ProtocolDemo // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import "Student.h" @implementation Student - (void)study{ NSLog(@"study"); } //直接在.m文件中實現便可,不須要在.h文件中再次定義 #pragma mark - WithProtocol - (void)finshTask{ NSLog(@"完成任務"); } - (void)dontLate{ //#warning 代碼過幾天在補充 NSLog(@"不遲到"); } - (void)wearNeat{ NSLog(@"穿戴整潔"); } @end而後咱們在實現類中,去實現協議中必需要實現的方法
注:這裏用到了
#pragma mark - WithProtocol
這個做用就是作一下標記,標記後面的方法都是協議中的方法,這樣就能夠將一個類中的方法類別分的更細,咱們在文件導航欄中進行查看:
光標要放到#param那裏,上面的文件欄纔會出現@implementation Student
而後咱們點擊@implementation Student
看到了協議中的方法和類自己的方法就被分開了,這樣便於瀏覽
還有一個是
#warning 代碼過幾天在補充
這個就是標記此處代碼有一個警告,Xcode會在此處顯示黃色標記,這個做用就是給本身添加一個標記,後續在來查看
好比,我在開發的過程當中,此處的代碼仍是有一些問題的,可是可能臨時不能處理,等之後有時間在回過頭來修改,就是打個標記。
測試類:
// // main.m // 11_ProtocolDemo // // Created by jiangwei on 14-10-11. // Copyright (c) 2014年 jiangwei. All rights reserved. // #import <Foundation/Foundation.h> #import "Student.h" int main(int argc, const char * argv[]) { @autoreleasepool { Student *stu = [[Student alloc] init]; [stu finshTask]; [stu dontLate]; //判斷wearNeat方法有沒有在Student中實現了 if([stu respondsToSelector:@selector(wearNeat)]){ [stu wearNeat]; } } return 0; }這裏有一個方法 respondsToSelector:@selector,這個方法的做用是判斷當前對象中是否認義了一個方法,這個方法仍是頗有用的,若是在Java中,咱們可能須要用反射去實現了。
總結
協議在OC中也是一個很重要的概念,Foundation框架中不少地方都用到了協議,其實和Java中的抽象類以及接口很是類似