淺談iOS開發的協議(protocol)和代理(delegate)


協議和代理對於一個新手來說確實不討好理解,也有很多的iOS開發的老手對此是懂非懂的。網上的很多博文只是講了怎么使用,並沒有說的很明白。下面我談一下我的理解。

1.你要先搞明白,協議和代理為什么會出現,也就是說它存在的意義是什么,解決了什么問題。

協議和代理是模塊化開發和封裝的產物。
先講一個小故事幫助大家理解:

老王有一家餐館,剛剛開始的時候規模很小,所以老王一個人做了所有的事情:掃地,做菜,迎賓,上菜,收銀。但是后面隨着規模的擴大,老王一個人就吃不消了,忙死也忙不過來了。這時候怎么辦?大家都很清楚吧,招人唄!所以后面就有了服務員,收銀員,大廚,保潔員。
這就意味着原先老王的工作按模塊進行了拆分。

老王開餐館

餐館的工作流程(業務邏輯)簡單來說是這樣的:點餐->做菜->上菜->收銀->打掃衛生。

轉換成編程世界的模型就是這樣的:業務不是很復雜的時候,我們把所有的功能都寫在一個類里面,這個類暫且叫老王,理論上所有的事情和功能都可以寫到這個類里面。做菜方法,上菜方法,打掃方法......就造成了老王這個類非常的龐大和臃腫,並且容易出錯。

那我們開始招人了,新建了大廚類,服務員類,收銀類,保潔類,這四個類。大廚類有做菜方法,服務員類點菜,上菜方法,收銀類有收銀方法,保潔類有打掃方法。

僅僅這樣還是不行的,因為模塊開發必然就有模塊分化以后模塊之間的通信問題。大廚類只做菜 但是菜做好了怎么辦,必須及時的上菜,讓顧客享用。但是大廚自己不能上菜,所以大廚必須拋出菜做好了的信號,具體這個菜上不上,怎么上,就不是大廚關心的了。

2.協議和代理所發揮的作用

老王交代大廚,你只管做菜,菜做好了以后喊一聲菜做好了(我見過一個餐館是拉鈴鐺)。
那么老王跟大廚定的這個規矩就是協議(protocol),下面看代碼:

DaChu.h

/**
 *  下面是聲明協議的固定格式,DaChuDelegate是協議的名稱,因為是代理協議,名稱格式為:類名+Delegate
 */
@protocol DaChuDelegate <NSObject>
- (void)doSomethingAftercaiZuohaole;
@end

@interface DaChu : NSObject
/**
 *  delegate 是dachu類的一個屬性,weak 關鍵字是為了避免循環引用,<DaChuDelegate>表示遵守DaChuDelegate協議
 *  更加直白點:在大廚心里有一個人接受他的菜好了的信號去做一些事情,具體這個人是誰,大廚不關心,這個人的代號是delegate
 */
@property (nonatomic, weak) id <DaChuDelegate> delegate;
- (void)kaiShiZuoCai;
@end
Dachu.m
#import "DaChu.h"

@implementation DaChu
- (void)kaiShiZuoCai{
    NSLog(@"開始做菜");
    sleep(2);
    NSLog(@"做好菜了,該上菜了");
    
   //下面這句是判斷 一下delegate是否實現了doSomethingAftercaiZuohaole方法,如果delegate沒有實現
    //直接[self.delegate doSomethingAftercaiZuohaole];會crash
    if ([self.delegate respondsToSelector:@selector(doSomethingAftercaiZuohaole)]) {
        [self.delegate doSomethingAftercaiZuohaole];
    }
    
}
@end

下面看一看laowang這個類里面的內容

#import "LaoWang.h"
#import "DaChu.h"

@interface LaoWang ()<DaChuDelegate>//<DaChuDelegate>表示遵守DaChuDelegate協議,並且實現協議里面的方法

@end

@implementation LaoWang
- (void)laoWangKaiYe{
    NSLog(@"老王開業了");
    
    DaChu *dachu1 = [[DaChu alloc] init];
    dachu1.delegate = self;//說明老王充當代理的角色,負責接收菜好了的信號。
    [dachu1 kaiShiZuoCai];//大廚開始做菜
}
- (void)doSomethingAftercaiZuohaole{
    NSLog(@"老王知道了");//這里可以通知服務員去上菜了
}
@end

上面的這個過程,也可以看下圖來理解:
代理和協議
關於協議的理解,大家還可以參考這篇博文。
http://www.cnblogs.com/iyou/p/3636848.html

如果你喜歡這篇文章,請關注我,您的支持十分重要!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM