【IOS沉思录】IOS中的协议Protocol与代理Delegate

本文介绍了Objective-C中的协议和代理概念,对比了协议与Java接口的不同,并详细解释了协议的必选和可选方法特性。此外,还展示了如何通过协议实现代理模式,包括定义代理方法及其实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的回调监听机制,大大提高了编程的灵活性。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr_厚厚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值