iOS中的Protocol

作者: JamesYu | 来源:发表于2015-07-29 23:34 被阅读9883次

最近工作中遇到一个比较迷惑的事情,在我利用runtime获取类的属性的时候,由于类实现了一个自定义协议,导致遍历出来的属性中包含了NSObject协议中的property。查来查去,只是知道和protocol有关。晚上问了下朋友(iOS大神),结果被他一句点破。发现这部分知识点遗漏了一点。

protocol类似java中的interface,主要是用来定义一套对象之间的通信规则。protocol也是我们设计时常用的一个东西,相对于直接继承的方式,protocol则偏向于组合模式。因为在设计对象的时候,如果基类东西很多,而不同的子类又不一定都需要基类的东西,或者在绝大部分需要的同时,又有特殊的要求,那这个时候就很混乱了。采用接口,可以将不同的功能归类为不同的接口,这样,子类需要什么功能,自己去实现这个接口,这样在保持继承性的同时,可以对功能进行扩展,而不影响其他类,也让子类保持自己的特有性。

protocol语法:

@protocol protocolName

//method

//property

@end```


和类的声明很相似,不仅可以什么方法,同样也可以声明```property```。如果某个类需要实现某个接口,则只需要在类的申明后面加上<>,在里面写上要实现的协议名字,多个协议以逗号隔开。
```objc
@interface Test : NSObject <delegate1, delegate2>

@end

protocol关键字:required,optional

@protocol TestProtocol

@required
- (void)requiredMethod;
@optional
- (void)optionalMethod;
@end```


protocol默认都是required的,一个类在实现协议的时候是必须要实现这些方法的。相对的,如果optional下面的方法,则表示类可以选择性的实现。判断这个类是否实现某个方法则只需调用```[self.delegate respondToSelector:@selector()]```

#protocol的继承
protocol和类一样,同样可以进行继承,这个也是我遗漏的一点。

```objc
@protocol Test1Delegate
@end

@protocol Test2Delegate <Test1Delegate>
@end;```


这个时候,如果类实现了Test2Delegate这个协议,那么也必须实现Test1Delegate里面的方法。 我们自己写的protocol的时候,一般Xcode都默认帮我们继承了NSObject这个协议。如果你不继承的话也没啥大的影响,因为我们的对象都是继承自NSObject,而NSObject也实现了```NSObject```这个协议。所以,当我们需要调用NSObject协议里面的方法的时候,也不会出错。不过苹果还是推荐继承NSObject这个协议。



#protocol隐藏类的类型

在我们iOS开发中也会出现这种形式,比如iOS7的导航栏动画,苹果只是需要你返回一个实现了```UIViewControllerAnimatedTransitioning```这个协议的对象就行了。

还有一个可能在和第三方sdk打交道的时候见得比较多。在别人实现的框架里面,有的时候,不希望把类的类型和里面方法暴露给你,而你也不太可能直接创建这个对象。这个时候就可以采用protocol这个方式,让调用者无需知道类的类型,一样可以完成自己想要的操作。

```objc
id <Test1Delegate>obj = [XXXX  createObj];

调用者只需要通过[XXXX createObj]这个方法,获取一个实现Test1Delegate而不知道类型的实例。在需要的地方,这个obj可以直接调用协议里面的方法,因为,这个对象都已经实现了。

protocol 差不多就这么多内容,比较简单。

相关文章

  • iOS中的Protocol

    Protocol基本概念 类似于java的接口interface,接口就是一堆方法的声明,没有实现,在OC中接口是...

  • iOS中的Protocol

    最近工作中遇到一个比较迷惑的事情,在我利用runtime获取类的属性的时候,由于类实现了一个自定义协议,导致遍历出...

  • iOS中的Protocol

    最近工作中遇到一个比较迷惑的事情,在我利用runtime获取类的属性的时候,由于类实现了一个自定义协议,导致遍历出...

  • iOS协议详解,协议中定义属性

    协议中定义属性 可参考文章iOS开发 - protocol中定义属性

  • ios中的协议——protocol

    思考:在一个类中,能否让一个类必须实现某种方法? 一、 非正式协议 非正式协议就是类别,即凡是NSObject或其...

  • iOS Swift中的Protocol

      最近在看王巍大神的《Swift必备Tips》这本书,发现里面写的Tips都很实用,很值得推荐,是个进阶的不错选...

  • iOS 中的协议 — @protocol

    1. 关于Protocol 在使用OC开发iOS程序的过程中经常会用到Protocol,定义一个Protocol的...

  • SwiftUI App 增加 AppDelegate

    iOS 14中,SwiftUI apps遵循App protocol,没有遵循UIApplicationDeleg...

  • Delegate - protocol协议及委托代理(Deleg

    参考文档 iOS 用Protocol 给类加共享的属性 iOS开发-Protocol协议及委托代理(Delegat...

  • ios关键字的说明

    iOS 关键字说明 protocol,mutating, extension, override protocol...

网友评论

  • 豆丶浆油条:如果你不继承的话也没啥大的影响,因为我们的对象都是继承自NSObject,这句话有点问题。因为声明一个遵守协议的对象的时候,一般都用id类型。这时候用NSObject,里面的方法就会有问题。
  • 8d2b8086c81a:协议加@property 应用场景,以及怎么加?
    8d2b8086c81a:@JamesYu :broken_heart:
    JamesYu:@誓愿枫 这个用得比较少,大家都知道添加方法。但是有时候我们也需要获得这个delegate里面的特定值。你可以用方法解决,也可以用property
  • dibadalu:加深了对protocol的理解,好评,

本文标题:iOS中的Protocol

本文链接:https://www.haomeiwen.com/subject/ymipqttx.html