Tôi đã thấy việc sử dụng các giao thức Objective-C được sử dụng theo kiểu như sau:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
Tôi đã thấy định dạng này được sử dụng thay vì viết một siêu lớp cụ thể mà các lớp con mở rộng. Câu hỏi là, nếu bạn tuân thủ giao thức này, bạn có cần tự tổng hợp các thuộc tính không? Nếu bạn đang mở rộng một siêu lớp, câu trả lời rõ ràng là không, bạn không cần phải làm vậy. Nhưng làm thế nào để một người đối phó với các thuộc tính mà một giao thức yêu cầu phải tuân thủ?
Theo hiểu biết của tôi, bạn vẫn cần khai báo các biến đối tượng trong tệp tiêu đề của một đối tượng phù hợp với một giao thức yêu cầu các thuộc tính này. Trong trường hợp đó, chúng ta có thể cho rằng chúng chỉ là một nguyên tắc chỉ đạo không? Hoàn toàn giống nhau không phải là trường hợp cho một phương pháp cần thiết. Trình biên dịch sẽ tát cổ tay của bạn để loại trừ một phương thức cần thiết mà một giao thức liệt kê. Câu chuyện đằng sau tài sản là gì?
Đây là một ví dụ tạo ra lỗi biên dịch (Lưu ý: Tôi đã cắt mã không phản ánh vấn đề trong tay):
MyProtocol.h
@protocol MyProtocol <NSObject>
@required
@property (nonatomic, retain) id anObject;
@optional
TestProt ProtocolViewCont điều khiển.h
- (void)iDoCoolStuff;
@end
#import <MyProtocol.h>
@interface TestProtocolsViewController : UIViewController <MyProtocol> {
}
@end
TestProt ProtocolViewContoder.m
#import "TestProtocolsViewController.h"
@implementation TestProtocolsViewController
@synthesize anObject; // anObject doesn't exist, even though we conform to MyProtocol.
- (void)dealloc {
[anObject release]; //anObject doesn't exist, even though we conform to MyProtocol.
[super dealloc];
}
@end