iOS基础:协议使用的一些理解

近期在看SD的源码的时候,看到了下面这个写法:

id operations = operationDictionary[key];
if ([operations conformsToProtocol:@protocol(SDWebImageOperation)]){
    [(id<SDWebImageOperation>) operations cancel];
}

可能是我代码看的还不够多,对于这样[(id<SDWebImageOperation>) operations cancel]的写法还是第一次见。(协议难道不都是和代理一起用的吗!!)于是好奇的我决定了解一下这种写法。
首先operations是遵守<SDWebImageOperation>协议的, operationsid类型的,它是从operationDictionary中取出来的。通常情况下,它是一个SDWebImageCombinedOperation类型的对象。(特殊情况也会是一个数组,里面还是一堆SDWebImageCombinedOperation类型的对象,当然sd也做了处理,我就不细说了。)

�下面先看看<SDWebImageOperation>这个协议:

@protocol SDWebImageOperation <NSObject>
- (void)cancel;
@end

很简单,就申明了一个方法。

再看看SDWebImageCombinedOperation类:

@interface SDWebImageCombinedOperation : NSObject <SDWebImageOperation>

果然是遵守<SDWebImageOperation>协议的。那么就应该能在他的.m文件找到- (void)cancel;方法的实现。
果然,我们可以找到。

cancel实现.png

但是我把上面的代码去掉协议申明改成这样[operations cancel];,还是能成功调用。原因就是在于当我们得到operations的时候,他已经是一个遵循<SDWebImageOperation>协议的对象了。所以不管调用cancel的时候是否有写明,问题都不大。

现在还有最后一个疑问,为什么不直接在SDWebImageCombinedOperation的.h文件中声明- (void)cancel;方法,这样不就可以直接调用了而避开了协议吗。
大佬告诉我了:这样写的目的是为了方便。当有几十个类都要有- (void)cancel;方法时候,如果不用协议方法,就需要在几十个类中都声明方法。而用协议,只需要遵守,就可直接开始实现了。

当然我仍有不服,那为什么不直接来个父类再继承呢。
大佬耐心说道:如果你已经开发一半,难道再新建父类吗。或者这么多类都是杂七杂八的,也不能都继承同一个类。

虽然觉得有道理,但感觉还是不太舒服。如果你看到这篇文章又有自己的理解,请告诉我。谢谢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 技术无极限,从菜鸟开始,从源码开始。 由于公司目前项目还是用OC写的项目,没有升级swift 所以暂时SDWebI...
    充满活力的早晨阅读 12,906评论 0 2
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,643评论 0 6
  • 1.项目经验 2.基础问题 3.指南认识 4.解决思路 ios开发三大块: 1.Oc基础 2.CocoaTouch...
    扶光启玄阅读 5,252评论 0 13
  • 18号 叶春平(简书:叶老巫) 图、文:叶老巫 一、 我,70后老青年。 第一学历是中专(中师),中国第一批小中专...
    叶两步阅读 901评论 13 34
  • 人家是眼一闭一睁,一天过去了,我是往沙发上一躺一天就过去了。
    不知是谁阅读 313评论 1 3

友情链接更多精彩内容