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属性类型以避免内存泄漏。