近期在看SD的源碼的時(shí)候,看到了下面這個(gè)寫法:
id operations = operationDictionary[key];
if ([operations conformsToProtocol:@protocol(SDWebImageOperation)]){
[(id<SDWebImageOperation>) operations cancel];
}
可能是我代碼看的還不夠多,對(duì)于這樣[(id<SDWebImageOperation>) operations cancel]
的寫法還是第一次見(jiàn)。(協(xié)議難道不都是和代理一起用的嗎!!)于是好奇的我決定了解一下這種寫法。
首先operations
是遵守<SDWebImageOperation>
協(xié)議的, operations
是id
類型的,它是從operationDictionary
中取出來(lái)的。通常情況下,它是一個(gè)SDWebImageCombinedOperation
類型的對(duì)象。(特殊情況也會(huì)是一個(gè)數(shù)組,里面還是一堆SDWebImageCombinedOperation
類型的對(duì)象,當(dāng)然sd也做了處理,我就不細(xì)說(shuō)了。)
?下面先看看<SDWebImageOperation>
這個(gè)協(xié)議:
@protocol SDWebImageOperation <NSObject>
- (void)cancel;
@end
很簡(jiǎn)單,就申明了一個(gè)方法。
再看看SDWebImageCombinedOperation
類:
@interface SDWebImageCombinedOperation : NSObject <SDWebImageOperation>
果然是遵守<SDWebImageOperation>
協(xié)議的。那么就應(yīng)該能在他的.m文件找到- (void)cancel;
方法的實(shí)現(xiàn)。
果然,我們可以找到。
但是我把上面的代碼去掉協(xié)議申明改成這樣[operations cancel];
,還是能成功調(diào)用。原因就是在于當(dāng)我們得到operations的時(shí)候,他已經(jīng)是一個(gè)遵循<SDWebImageOperation>
協(xié)議的對(duì)象了。所以不管調(diào)用cancel的時(shí)候是否有寫明,問(wèn)題都不大。
現(xiàn)在還有最后一個(gè)疑問(wèn),為什么不直接在SDWebImageCombinedOperation
的.h文件中聲明- (void)cancel;
方法,這樣不就可以直接調(diào)用了而避開(kāi)了協(xié)議嗎。
大佬告訴我了:這樣寫的目的是為了方便。當(dāng)有幾十個(gè)類都要有- (void)cancel;
方法時(shí)候,如果不用協(xié)議方法,就需要在幾十個(gè)類中都聲明方法。而用協(xié)議,只需要遵守,就可直接開(kāi)始實(shí)現(xiàn)了。
當(dāng)然我仍有不服,那為什么不直接來(lái)個(gè)父類再繼承呢。
大佬耐心說(shuō)道:如果你已經(jīng)開(kāi)發(fā)一半,難道再新建父類嗎。或者這么多類都是雜七雜八的,也不能都繼承同一個(gè)類。
雖然覺(jué)得有道理,但感覺(jué)還是不太舒服。如果你看到這篇文章又有自己的理解,請(qǐng)告訴我。謝謝。