协议与委托

Posted 萌蛋白

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了协议与委托相关的知识,希望对你有一定的参考价值。

一. 协议

1. 类似于接口,用于定义多个类应该遵守的规范:

  并不关心这些类的内部状态数据,也不关心这些类里方法的具体实现,只是规定这些类要提供某些方法。

2. 使用@protocol关键字:

1 @protocol 协议名 <父协议1, 父协议2, ...>
2 {
3   statement...    
4 }

  注意:

    • 一个协议可以继承多个协议,但是协议不能继承类
    • 方法:只是声明,没有具体实现。

3.  遵守协议的类(即代理):

  • 如果没有实现协议中的所有方法,编译器会发出警告:
    • @optional:声明的方法可选择是否实现
    • @required:声明的方法是必须要实现的。@required是默认行为
@protocol FKPersonAction
// 定义协议的方法
@optional
- (void) makeUp;
@required
- (void) walk;
@end

  可选实现makeup方法,但是必须实现walk方法,否则编译器就会提示警告

4. 声明对象的方法:

  • 方法一:实现类定义对象
FKPerson *person = [[FKPerson alloc] init];
  • 方法二:协议来定义对象
    • NSObject<协议1, 协议2, ...> *变量;
    • id<协议1, 协议2, ...> *变量;
  • 注意:
    • 采用协议来定义对象,类似于其他语言使用接口定义变量的语法
    • 采用协议来定义对象,对象的编译时类型仅仅是所遵守的协议类型,所以只能调用该协议中定义的方法

 

二. 协议与委托(delegate)

1. 协议体现的是一种规范,定义协议的类可以把协议定义的方法委托给实现协议的类,这样可以让类定义具有更好的通用性,因为具体的动作将有该协议的实现类去完成。

 

以上是关于协议与委托的主要内容,如果未能解决你的问题,请参考以下文章

GroovyMOP 元对象协议与元编程 ( 方法委托 | 正常方法调用 | 方法委托实现 | 代码示例 )

第23条:通过委托与数据源协议进行对象间通信

iOS 委托代理与协议(Delegate and Protocol)

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段

协议与委托

协议(Protocol)与委托代理(Delegate)