मैंने देखा है कि ऑब्जेक्टिव-सी प्रोटोकॉल का उपयोग निम्न प्रकार से किया जाता है:
@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