OC學習篇之---協議的概念和用法 分類: IOS 2014-12-06 16:25 5052人閱讀 評論(1) 收藏

在前一篇文章中咱們介紹了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中的抽象類以及接口很是類似

相關文章
相關標籤/搜索