Objective-C 协议(Protocols)
Objective-C 支持您定义协议,这些协议声明了预期用于特定情况的方法。在符合协议的类中实现协议。
举一个简单的例子,一个网络 URL 处理类,它将有一个协议,其中包含 processCompleted
委托方法等方法,一旦网络URL获取操作结束,该方法将通知调用类。
协议的语法如下:
@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end
关键字 @required
下的方法必须在符合协议的类中实现, @optional
关键字下的方法是可选的。
下面是符合协议的类的语法:
@interface MyClass : NSObject <MyProtocol>
...
@end
这意味着 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-07-07 21:15:50.362 Protocols[275:303] Printing Details
2022-07-07 21:15:50.364 Protocols[275:303] Printing Process Completed
在上面的实例中,我们看到了 delgate
方法是如何调用和执行的。它以 startAction
开始,一旦流程完成,将调用委托方法 processCompleted
以通知操作完成。
在任何 iOS 或 Mac 应用程序中,我们都不会在没有委托的情况下实现程序。因此,了解委托的用法非常重要。委托对象应使用 unsafe_unretained
属性类型以避免内存泄漏。