標籤:
1、協議:協議不是類,是一種約定,他聲明的方法和屬性,都是獨立於其他任何特定的類,並本身不會去實現他,讓使用他的類去實現他,比如UITableView,需要實現他的cellForRowAtIndexPath等協議,誰用誰知道。
協議的兩個先行編譯指令@optional:可以選擇的方法。@required:必須執行的方法。
我們開啟UITableView的標頭檔,看下他的聲明:
@protocol UITableViewDataSource<NSObject>@required- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;// Row display. Implementers should *always* try to reuse cells by setting each cell‘s reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
可以看到,這些方法是協議要求你必須實現的。
現在來看看寫周報的事,
我們建立一個類,Work
在Work.h頭部申明要寫周報(協議)
Work.h:
#import <Foundation/Foundation.h>@protocol Weekly <NSObject>;@required-(NSString *)Progress;@optional-(NSString *)Advice;@end@interface Work : NSObject@end
Weekly協議裡面有個方法,就是Progress"進度",而且是@required的強制要求實現的
還有一個方法 Advice "建議",是@optional可實現可不實現
2、委託
假設主管是A類
A.h裡面:
#import "Work.h"@interface A : NSObject//定義一個委託代理@property (nonatomic) id <Weekly> delegate;@end
@property (nonatomic) id <Weekly> delegate;
就像主管開會,宣布了一個任務 :delegate,這個任務就是要寫周報 :<Weekly>
接下來分配
員工B類、C類、D類等,我就指寫一個B類做例子
A.m裡面:
#import "A.h"//匯入B#import "B.h"@implementation A-(instancetype)init{ self = [super init]; //執行個體化員工B B* b = [[B alloc] init]; //設定代理的實現者是B員工對象,等於分配任務給他 self.delegate = b; //主管查看B員工的周報 NSString* B_Progress = [b Progress]; NSString* B_Advice = [b Advice]; NSLog("%@",B_Progress); NSLog("%@",B_Advice); return self;}
我們會發現self.delegate = b; 會有警告,為什麼呢?因為B員工現在還只是員工B,不是已經投入寫周報的B員工,因為他還沒接受你這個任務,是不是?我做不做那是我的事,你交代給我我不做,那你就麻煩了,我可以不寫,大不了不幹是吧?跟上級有衝突的屌絲就是這樣,各種理由各種反駁,如果B接受任務,就要受寫周報約束,來看下
B.h裡面:
//匯入協議類#import "Work.h"//<Weekly>遵循周記的協議,必須寫周記@interface B : NSObject <Weekly>@end
B.m裡面實現:
//周記必須寫的內容-(NSString *)Progress{ return @"xxx項目進度達到90%!";}//可寫可不寫的內容-(NSString *)Advice{ return @"主管英明神武,沒有意見!";}
這樣,B類就實現了協議的內容,完成了主管分配的任務,並返回結果。如果不實現Progress,xcode會警示告,你沒有實現這兩個代理。
iOS中 委託 代理 協議 的理解