আমি উদ্দেশ্যমূলক-সি প্রোটোকলগুলির ব্যবহারগুলি নীচের মতো কোনও ফ্যাশনে ব্যবহার করতে দেখেছি:
@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