做了一年的iOS,想記錄自己對知識點的一點理解。
原文:http://www.companysz.com/A--G/p/4900241.html 轉(zhuǎn)載請注明
第一篇,想記錄一下iOS中delegate(委托,也有人稱作代理)的理解吧
故名思議,delegate就是代理的含義, 一件事情自己不方便做,然后交給其他人去幫助實現(xiàn), 比如A、B兩個類,A的一個對象有一個任務(wù)aTask要在B類中實現(xiàn),任務(wù)無法在A類本身中實現(xiàn),所以要交給B類幫忙,則A和B約定一個協(xié)議:
A類中:
@PRotocol ADelegate <NSObject>
-(void)aTask;
@end
//代理屬性,同時約定作為代理的對象必須實現(xiàn)ADelegate協(xié)議
@property (nonatomic,retain) id<ADelegate> aDelegate;
B類中:
而B類中,B類繼承A的代理,表示同意該協(xié)議,以后我們就按說好的辦事了:
//繼承A的代理協(xié)議
@interface B () <ADelegate>
@end
B用一個事件,比如按鈕點擊,在點擊方法onBButtonClicked里觸發(fā)任務(wù):
//按鈕點擊
-(void)onBButtonClicked{
//在B類中,初始化一個A類的對象aObj = [[A alloc] init];
AViewController *aObj = [[AViewController alloc] init];
//指定A類的代理,這事就交給aObj你去做了。
aObj.aDelegate = self;
//判斷_aDelegate實例是否實現(xiàn)了aTask方法
//避免未實現(xiàn)aDelegate的類也作為A的監(jiān)聽
if([A.aDelegate respondsToSelector:@selector(aTask)]){
//_viewDelegate對象調(diào)用代理方法觸發(fā)任務(wù)
[A.aDelegate aTask];
NSLog(@"excute A`s aTask");
}
}
//在代理方法里實現(xiàn)A所交代的任務(wù)
-(void)aTask{
//具體任務(wù)內(nèi)容
NSLog(@"aTask is execute.");
}
小demo 鏈接: DelegateDemo.zip
補充: 1.在協(xié)議@Protocol里,有些方法不一定都需要實現(xiàn),可以根據(jù)需求添加一些關(guān)鍵字來標記方法的重要性,比如
@required //必須實現(xiàn)的方法 @optional //可選實現(xiàn)的方法
2.協(xié)議可以擴展自另一個協(xié)議,aDelegate就擴展自NSObject;
3.協(xié)議中不能定義屬性、成員變量等,只能定義方法;
引論:
事實上在ObjC中協(xié)議的更多作用是用于約束一個類必須實現(xiàn)某些方法,而從面向?qū)ο蟮慕嵌榷赃@個類跟接口并不一定存在某種自然關(guān)系,
可能是兩個完全不同 意義上的事物,這種模式我們稱之為代理模式(Delegation)。在Cocoa框架中大量采用這種模式實現(xiàn)數(shù)據(jù)和UI的分離,
而且基本上所有的協(xié)議都 是以Delegate結(jié)尾。
參考鏈接: http://blog.csdn.net/jianxin160/article/details/47753189
新聞熱點
疑難解答