Protocol和Delegate简介
Protocol协议类似于Java中的接口,是一个自定义方法的集合,让遵守这个协议的类去是实现为了达到某种功能的这些方法,与Java接口不同的是协议中可以定义可选择实现的方法。Delegate代理是一种设计模式,是一个概念,只不过在Objective-C中通过Protocol来进行实现,指的是让其他类来通过本类中定义的协议代理方法‘远程’帮助实现一些操作,完成一些任务,本类会在合适的时机通过代理通知实现协议的远程类去做指定的任务。
通过协议实现代理模式的示例
协议代理来源的本类:
#import <UIKit/UIKit.h>
/**
* 定义协议
*/
@protocol AccountDelegate <NSObject>
@required // 必须实现的方法,默认是@required
// 选中cell的代理事件
- (void) selectedCell:(NSInteger)index;
@optional // 非必须实现的方法
// 更新下拉菜单的高度
- (void) updateListH;
@end
@interface PopListTableViewController : UITableViewController
/**
* 定义代理,委托其他类来帮助本类完成一些其他任务,本类通过下面定义的delegate来通知其他实现上面协议的其他类
*/
@property (nonatomic, weak) id<AccountDelegate>delegate;
@end
然后本类在实现中通过定义的delegate通知其他遵守协议的类去执行某个方法:
// 通知代理,同时将cell的行号传出去
[_delegate selectedCell:indexPath.row];
然后遵守协议的类就可以收到上面的通知自动执行(注意是通知触发的方法执行,是一种回调而不是手动调用)selectedCell这个方法了:
首先要在实现中声明遵守上面的协议:
// 遵守AccountDelegate协议,如果遵守多个协议用逗号隔开:<AccountDelegate, ...>
@interface PopMenuViewController()<AccountDelegate>
实现协议方法:
/**
* 实现协议方法,监听代理,代理通知来了后下面的方法会自动执行,接收传过来的参数
*/
- (void)selectedCell:(NSInteger)index {
// 这里可以做一些事情,也就是想委托当前这个类要做的那些任务了
// ...
}
问题1: Difference between protocol in Objective-C and interfaces in Java?Objective-C中的协议和java中的接口概念有何不同?
Objective-C中的协议和java中的接口非常类似,但Java中的接口规定实现接口的类必须要实现接口中定义的所有方法,当然默认Objective-C协议中定义的方法也是要必须实现的,只不过Objective-C的协议里的方法有两种类型:必选类型(@required)和可选类型(@optional)。必须类型是必须要实现的,而可选类型是根据需要选择性实现的。默认是必选类型。
问题2: OC中协议的概念以及协议中方法的默认类型?
OC中的协议类似于Java中的接口,是一个功能方法的集合,但协议本身不是一个类不会自己去实现协议里的方法,而是委托其他任何类去使用实现,通常用来实现委托代理设计模式,实现不同类对象之间的事件消息通信。
协议中的方法默认都是@required类型的,也就是使用该协议的类必须实现协议里的这些方法。而明确使用@optional修饰的方法可以被使用的类选择性的去实现。
问题3: 什么是代理?作用是什么?
代理是一种设计模式,又叫‘委托’,指的是一个类对象在某些特定时刻通知到其他类的对象去做一些任务,但不需要获取到那些类对象的指针,两者共同来完成一件事,实现不同对象之间的通信。
作用主要是大大减小了对象之间的耦合度,是代码逻辑更加清晰有序,减少了框架复杂度,也便于代码的维护扩展。另外消息的传递过程可以有参数回调,类似于Java的回调监听机制,大大提高了编程的灵活性。