ฉันเคยเห็นการใช้โปรโตคอล Objective-C ในรูปแบบดังต่อไปนี้:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
ฉันเคยเห็นรูปแบบนี้ใช้แทนการเขียนซูเปอร์คลาสที่เป็นรูปธรรมที่คลาสย่อยขยายออกไป คำถามคือถ้าคุณปฏิบัติตามโปรโตคอลนี้คุณจำเป็นต้องสังเคราะห์คุณสมบัติด้วยตัวเองหรือไม่? หากคุณกำลังขยายซูเปอร์คลาสคำตอบคือไม่คุณไม่จำเป็นต้องทำ แต่จะจัดการกับคุณสมบัติที่โปรโตคอลต้องการให้สอดคล้องได้อย่างไร?
ตามความเข้าใจของฉันคุณยังคงต้องประกาศตัวแปรอินสแตนซ์ในไฟล์ส่วนหัวของอ็อบเจ็กต์ที่สอดคล้องกับโปรโตคอลที่ต้องการคุณสมบัติเหล่านี้ ในกรณีนี้เราสามารถสันนิษฐานได้ว่านั่นเป็นเพียงหลักการชี้นำ? เหมือนกันไม่ใช่กรณีของวิธีการที่จำเป็น คอมไพเลอร์จะตบข้อมือของคุณเพื่อยกเว้นวิธีการที่จำเป็นซึ่งโปรโตคอลแสดงรายการ เรื่องราวเบื้องหลังคุณสมบัติคืออะไร?
นี่คือตัวอย่างที่สร้างข้อผิดพลาดในการคอมไพล์ (หมายเหตุ: ฉันได้ตัดโค้ดซึ่งไม่ได้สะท้อนถึงปัญหาในมือ):
MyProtocol.h
@protocol MyProtocol <NSObject>
@required
@property (nonatomic, retain) id anObject;
@optional
TestProtocolsViewController.h
- (void)iDoCoolStuff;
@end
#import <MyProtocol.h>
@interface TestProtocolsViewController : UIViewController <MyProtocol> {
}
@end
TestProtocolsViewController.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