Objective-c基础:定义协议

Objective-C允许定义协议,协议就是一个固定的协定,声明用于处理特定情况的方法。 协议在符合协议的类中实现。一个简单的协议例子是网络URL处理的类,它定义了一个协议,其中包含processCompleted委托处理等方法,当网络URL提取操作结束,该类就会被调用。

协议的定义语法如下所示

@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end

Objective-C 关键字@required下的方法必须在符合协议的类中实现,@optional关键字下的方法是可选的,不是必须实现的。
协议类的定义格式如下:

@interface MyClass : NSObject <MyProtocol>
...
@end

协议在某种程度上类似于C++中定义的函数接口。MyClass的任何实例不仅会响应接口中声明的特定方法,而且MyClass还会为MyProtocol中的所需方法提供实现。

没有必要在类接口中重新声明协议方法,采用协议提供的方法定义就足够了。如果一个类采用了多个协议,集成的协议通过逗号来进行分隔。以一个例子简单的说明一下协议的定义和使用。如下所示:

#import <Foundation/Foundation.h>

@protocol PrintProtocolDelegate
- (void)processCompleted;
@end

@interface PrintClass :NSObject {
   id delegate;
}
- (void) printDetails;
- (void) setDelegate:(id)newDelegate;
@end

@implementation PrintClass
- (void)printDetails {
   NSLog(@"Printing Details");
   [delegate processCompleted];
}

- (void) setDelegate:(id)newDelegate {
   delegate = newDelegate;
}
@end

@interface SampleClass:NSObject<PrintProtocolDelegate>
- (void)startAction;

@end

@implementation SampleClass
- (void)startAction {
   PrintClass *printClass = [[PrintClass alloc]init];
   [printClass setDelegate:self];
   [printClass printDetails];
}

-(void)processCompleted {
   NSLog(@"Printing Process Completed");
}
@end

主函数的调用流程如下图所示:

int main(int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
SampleClass *sampleClass = [[SampleClass alloc]init];
[sampleClass startAction];
[pool drain];
return 0;
}

执行上面示例代码,得到以下结果

2022-10-1 03:10:19.639 main[18897] Printing Details
2022-10-1 03:10:19.641 main[18897] Printing Process Completed

在上面的例子中,演示了委托方法如何调用和执行。 它以startAction开始,当进程完成,就会调用委托方法processCompleted,完成结束的操作。使用委托代理和协议,在一些特殊的场景下是非常好用的,不过委托对象应使用unsafe_unretained属性类型以避免内存泄漏。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

码农飞飞

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

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

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

打赏作者

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

抵扣说明:

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

余额充值