Giao thức Objective-C
Objective-C cho phép bạn xác định các giao thức, khai báo các phương thức dự kiến sẽ được sử dụng cho một tình huống cụ thể. Các giao thức được thực hiện trong các lớp phù hợp với giao thức.
Một ví dụ đơn giản sẽ là một lớp xử lý URL mạng, nó sẽ có một giao thức với các phương thức như phương thức ủy nhiệm processCompleted để tạo nội dung cho lớp gọi sau khi hoạt động tìm nạp URL mạng kết thúc.
Cú pháp của giao thức được hiển thị bên dưới.
@protocol ProtocolName
@required
// list of required methods
@optional
// list of optional methods
@end
Các phương pháp trong từ khóa @required phải được triển khai trong các lớp phù hợp với giao thức và các phương thức theo @optional từ khóa là tùy chọn để triển khai.
Đây là cú pháp cho lớp tuân theo giao thức
@interface MyClass : NSObject <MyProtocol>
...
@end
Điều này có nghĩa là bất kỳ phiên bản nào của MyClass sẽ không chỉ phản hồi các phương thức được khai báo cụ thể trong giao diện mà MyClass còn cung cấp các triển khai cho các phương thức được yêu cầu trong MyProtocol. Không cần phải khai báo lại các phương thức giao thức trong giao diện lớp - việc chấp nhận giao thức là đủ.
Nếu bạn cần một lớp để áp dụng nhiều giao thức, bạn có thể chỉ định chúng dưới dạng danh sách được phân tách bằng dấu phẩy. Chúng ta có một đối tượng ủy nhiệm chứa tham chiếu của đối tượng đang gọi thực thi giao thức.
Một ví dụ đã được biểu diễn ở dưới.
#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;
}
Bây giờ khi chúng ta biên dịch và chạy chương trình, chúng ta sẽ nhận được kết quả như sau.
2013-09-22 21:15:50.362 Protocols[275:303] Printing Details
2013-09-22 21:15:50.364 Protocols[275:303] Printing Process Completed
Trong ví dụ trên, chúng ta đã thấy cách các phương thức delgate được gọi và thực thi. Nó bắt đầu bằng startAction, khi quá trình này hoàn tất, phương thức ủy nhiệm processCompleted được gọi để hoàn thành hoạt động.
Trong bất kỳ ứng dụng iOS hoặc Mac nào, chúng tôi sẽ không bao giờ triển khai chương trình mà không có người được ủy quyền. Vì vậy, điều quan trọng là chúng ta hiểu cách sử dụng các đại biểu. Các đối tượng đại diện nên sử dụng loại thuộc tính không an toàn_unretained để tránh rò rỉ bộ nhớ.