------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