天天看點

黑馬程式員---OC學習筆記之protocol概念及基本使用

------Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練--------

一、protocol概念及基本使用

1、protocol的基本概念

1)在寫java得時候都會有借口interface這個概念,借口就是一堆方法的聲明沒有實作。而在OC中,interface是一個類的頭檔案的聲明,并不是真正意義上得接口的意思,在OC中,借口是一個由一個叫做【協定protocol】的來實作的。

2)這個裡面可以聲明一些方法,和java不同的是,他可以聲明一些必須實作和可以選擇實作的方法,這個是和java是完全不同的(java接口中的方法必須實作)。

3)【作用】供其他的類去遵守,如果一個雷遵守了一個協定,就應該實作這個協定中必須實作的方法。

2、protoco的使用流程

定義協定--》在類中采用指定的協定--》實作協定中的方法(注意方法有必須實作和選擇實作這兩種)

【定義協定】

格式:

@protocol 協定名稱<NSObject> //預設遵守NSObject協定

//方法聲明清單

@end

【注意】協定預設遵守NSObject協定(基協定)

【采納協定】

1)類遵守協定

建立類的時候遵守某個或者幾個協定

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

@end

某個協定也可以遵守某個或者某些協定,一個協定可以蹲守其他多個協定

1)協定遵守協定

@protocol 協定名稱 <其他協定名>

@end

3、@required和@optional

【用途】程式員之間的交流

@required這個方法必須實作,否則編譯器會發出警告,預設是必須實作的

@optional方法是可以選擇實作的。

二、protocol的使用注意事項

1、注意事項

1)Protocol:就一個用途,用來聲明一大堆的方法(不能聲明成員變量),不能寫實作

2)隻要遵守了某個類協定,就擁有了這個協定中所有的方法聲明

3)隻要父類遵守了某個協定,那麼子類也遵守

4)Protocol聲明的方法可以讓任何類去實作

5)OC不能多繼承,但是可以遵守多個協定,多個類也可以遵守同一個協定

6)基協定,<NSObject>是基協定,最最根本的協定,其中生命了很多最基本的方法

7)協定可以遵守協定,一個協定可以遵守另一個協定,就可以擁有另一個協定中聲明的方法

2、protocol基協定的介紹

基協定,<NSObject>是基協定,最最根本的協定,其中生命了很多最基本的方法。

最基本的方法有

description

release

retain

三、protocol代理設計模式引入

1、protocol代理設計模式引入

代理模式是在OC中經常遇到的一種設計模式。那什麼叫做代理模式呢?

舉個例子:有一個嬰兒,他本身不會吃飯和自造等等事情。于是嬰兒就請了一個保姆,接着嬰兒與保姆之間就商定了一個協定,其中寫明了保姆需要做什麼事情,此時保姆就是這個【代理人】。即:嬰兒和保姆之間有協定,保姆遵守該協定,遇事保姆就需要實作該協定中的條款稱為代理人。

2、【思考與實作】

【引入】

嬰兒餓了要吃東西,困了要睡覺,當嬰兒餓了或者額困了都需要保姆照顧,使用類實作此功能。

【第一步,指定協定】

照顧小孩的協定:lookBabyProtocol

 -喂嬰兒

 -哄睡覺

【第二步,建立相關類】

 1)嬰兒類:Baby

屬性值:保姆,體力值、睡眠值

行為:

A、想吃東西---保姆喂奶

B、想睡覺--保姆哄睡覺

2)保姆類(需要遵守協定)

【實作】

【lookBabyProtocol.h檔案】

#import <Foundation/Foundation.h>
@class Baby;
@protocol lookBabyProtocol <NSObject>
 
-(void)feedBaby:(Baby*)bb;
 
-(void)sleepyBaby:(Baby*)bb;
@end
           

【BabySister.h檔案】

#import <Foundation/Foundation.h>
#import "lookBabyProtocol.h"
//遵守協定
@interface BabySister : NSObject<lookBabyProtocol>
 
@end
           

【Baby .h 檔案】

#import <Foundation/Foundation.h>
#import "lookBabyProtocol.h"
@class BabySister;
 
@interface Baby : NSObject
 
@property(nonatomic,assign) int blood;//血量跟吃飯有關
@property(nonatomic,assign) int activity;//活力跟睡眠有關
//baby有個保姆,這樣是BabySister必須遵守協定
@property(nonatomic,strong) BabySister<lookBabyProtocol> *bs;
//想吃了
-(void)wantEat;
//想睡
-(void)wantSleep;
@end
           

【BabySitter.m檔案】

#import "BabySister.h"
#import "Baby.h"
@implementation BabySister
 
//實作協定中的方法
 
-(void)feedBaby:(Baby *)baby{
    baby.blood += 50;
    NSLog(@"保姆正在喂寶寶吃安眠藥,嬰兒血量:%d",baby.blood);
}
 
-(void)sleepyBaby:(Baby *)baby{
    baby.activity += 20;
    NSLog(@"保姆正在哄嬰兒睡覺,嬰兒活力:%d",baby.activity);
}
@end
           

【Baby.m檔案】

#import "Baby.h"
#import "BabySister.h"
@implementation Baby
 
-(void)wantEat{
    //寶寶餓了在哭
    NSLog(@"Baby is cring...");
    //保姆要喂baby
    [self.bs feedBaby:self];
}
 
-(void)wantSleep{
    //寶寶困了
    NSLog(@"Baby want to sleep...");
    //保姆要哄他睡覺
    [self.bs sleepyBaby:self];
}
@end
           

【main.m檔案】

#import <Foundation/Foundation.h>
 
#import "BabySister.h"
#import "Baby.h"
 
int main(int argc, const char * argv[])
{
 
    @autoreleasepool {
        //定義一個保姆對象
        BabySister *bs = [BabySister new];
        //定義一個寶寶對象
        Baby *b = [Baby new];
        b.bs = bs;
        [b wantEat];
        [b wantSleep];
   }
    return 0;
}
 
           

【列印結果】

2015-10-07 18:13:04.538 協定代理引入[1893:303] Baby iscring...

2015-10-07 18:13:04.540 協定代理引入[1893:303] 保姆正在喂寶寶吃安眠藥,嬰兒血量:50

2015-10-07 18:13:04.541 協定代理引入[1893:303] Baby want tosleep...

2015-10-07 18:13:04.541 協定代理引入[1893:303] 保姆正在哄嬰兒睡覺,嬰兒活力:20