一 : 簡述
在OC中協(xié)議-protocol,協(xié)議就是是一方法的聲明,這些方法可以有選擇實現(xiàn)與必須要實現(xiàn)的.
二 : 協(xié)議的定義
@protocol協(xié)議名稱
// 方法聲明列表
@end
示例
創(chuàng)建了一個協(xié)議,其中有一個必須實現(xiàn)的方法study
.h
@protocolStudyProtocol
- (void)study;
@end
三 : 遵守協(xié)議
有了協(xié)議,那么如何使用這個協(xié)議呢,讓類遵守協(xié)議
@interface類名 : 父類 <協(xié)議名稱1, 協(xié)議名稱2,…>@end
OC是單繼承,但是一個類可以遵守一個或多個協(xié)議
@interfacePerson:NSObject
@end
@implementationStudent
// 實現(xiàn)協(xié)議方法
-(void)EatSomting{NSLog(@"%s", __func__);}
// 實現(xiàn)協(xié)議方法
-(void)study{NSLog(@"%s", __func__);}
@end
協(xié)議和繼承的區(qū)別:
1.繼承之后默認(rèn)就有實現(xiàn), 而protocol只有聲明沒有實現(xiàn)
2.相同類型的類可以使用繼承, 但是不同類型的類只能使用protocol
3.protocol可以用于存儲方法的聲明, 可以將多個類中共同的方法抽取出來, 以后讓這些類遵守協(xié)議即可
四 : 協(xié)議的使用特點
1.父類遵守了某個協(xié)議,那么子類也自動遵守此協(xié)議
2.父類遵守了此協(xié)議
@interfacePerson:NSObject
@end
子類自然遵守此協(xié)議
.h
@interfaceStudent:Person
@end
.m
@implementationSutdent
-(void)study{ }
@end
協(xié)議可以遵守協(xié)議
一個協(xié)議遵守了另一個協(xié)議,就可以擁有另一份協(xié)議中的方法聲明
@protocolA
-(void)methodA;
@end
@protocolB
-(void)methodB;
@end
@interfaceTZperson:NSObject
-(void)methodA;// 同時擁有A/B協(xié)議中的方法聲明
-(void)methodB;
@end
基協(xié)議
每個協(xié)議都應(yīng)該遵守NSObject協(xié)議,它是一個基協(xié)議,最根本的協(xié)議.
@protocolA// 基協(xié)議-(void)methodA;
@end
required 與 optional關(guān)鍵字
required: 方法必須要實現(xiàn),不實現(xiàn)則編譯器會發(fā)出警告
optional: 方法不一定要實現(xiàn)
用于開發(fā)者之間的交流
如果沒有使用任何關(guān)鍵字修飾協(xié)議中的方法,那么該方法默認(rèn)就是required的,關(guān)鍵字并不能嚴(yán)格的控制某一個遵守該協(xié)議的類必須要實現(xiàn)該方法, 因為即便不是實現(xiàn)也不會報錯, 只會報一個警告
@protocolA
@required
-(void)methodA;
@optional
-(void)methodA;
@end
五 : 類型限定
定義協(xié)議
@protocolgirlGod
@required
-(void)beatuiful;
@optional
-(void)sexy;
@end
要求某些對象具備上述協(xié)議行為,可以將協(xié)議寫在數(shù)據(jù)類型的右邊,明確的標(biāo)注如果想給該變量賦值,那么該對象必須遵守某個協(xié)議
id girl = [girl new];
格式 : 數(shù)據(jù)類型<協(xié)議名稱> 變量名,和泛型是一個寫法
六 : respondsToSelector
當(dāng)某個類遵守了某個協(xié)議,但并意味著,它就一定要實現(xiàn)它,因為不實現(xiàn)也不報錯.當(dāng)這個類被實例化,意味著可以調(diào)用其遵守的協(xié)議方法,但如果沒有實現(xiàn)就會報錯,所以要使用respondsToSelector進(jìn)行判斷是否實現(xiàn)了某些協(xié)議方法
@protocolwiftPro
-(void)dohouseWork;
-(void)papapa;
@end
@interfacewife:NSObject
if([self.wift respondsToSelector:@selector(dohouseWork)])
{
[self.wift papapa];
}