প্রদত্ত উত্তরটি দুর্দান্ত কাজ করে এবং আমার প্রস্তাবটি এটিতে কেবলমাত্র একটি এক্সটেনশন যা খুব বেশি বয়লারপ্লেট কোড লেখা এড়ানো যায়।
বিভাগের বৈশিষ্ট্যগুলির জন্য বার বার গেটর এবং সেটার পদ্ধতিগুলি লেখা এড়াতে এই উত্তরটি ম্যাক্রোগুলির পরিচয় দেয়। অতিরিক্তভাবে এই ম্যাক্রোগুলি আদিম ধরণের বৈশিষ্ট্যগুলির যেমন int
বা হিসাবে ব্যবহার সহজ করে BOOL
।
ম্যাক্রো ছাড়াই ditionতিহ্যগত পদ্ধতির approach
Ditionতিহ্যগতভাবে আপনি যেমন একটি বিভাগের সম্পত্তি নির্ধারণ করেন
@interface MyClass (Category)
@property (strong, nonatomic) NSString *text;
@end
তারপরে আপনার কোনও সম্পর্কিত বস্তু এবং কী হিসাবে নির্বাচককে কী ( মূল উত্তর দেখুন ) ব্যবহার করে একটি গিটার এবং সেটার পদ্ধতি প্রয়োগ করতে হবে :
#import <objc/runtime.h>
@implementation MyClass (Category)
- (NSString *)text{
return objc_getAssociatedObject(self, @selector(text));
}
- (void)setText:(NSString *)text{
objc_setAssociatedObject(self, @selector(text), text, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end
আমার প্রস্তাবিত পদ্ধতির
এখন, ম্যাক্রো ব্যবহার করে আপনি পরিবর্তে লিখবেন:
@implementation MyClass (Category)
CATEGORY_PROPERTY_GET_SET(NSString*, text, setText:)
@end
ম্যাক্রো নিম্নলিখিত হিসাবে সংজ্ঞায়িত করা হয়:
#import <objc/runtime.h>
#define CATEGORY_PROPERTY_GET(type, property) - (type) property { return objc_getAssociatedObject(self, @selector(property)); }
#define CATEGORY_PROPERTY_SET(type, property, setter) - (void) setter (type) property { objc_setAssociatedObject(self, @selector(property), property, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }
#define CATEGORY_PROPERTY_GET_SET(type, property, setter) CATEGORY_PROPERTY_GET(type, property) CATEGORY_PROPERTY_SET(type, property, setter)
#define CATEGORY_PROPERTY_GET_NSNUMBER_PRIMITIVE(type, property, valueSelector) - (type) property { return [objc_getAssociatedObject(self, @selector(property)) valueSelector]; }
#define CATEGORY_PROPERTY_SET_NSNUMBER_PRIMITIVE(type, property, setter, numberSelector) - (void) setter (type) property { objc_setAssociatedObject(self, @selector(property), [NSNumber numberSelector: property], OBJC_ASSOCIATION_RETAIN_NONATOMIC); }
#define CATEGORY_PROPERTY_GET_UINT(property) CATEGORY_PROPERTY_GET_NSNUMBER_PRIMITIVE(unsigned int, property, unsignedIntValue)
#define CATEGORY_PROPERTY_SET_UINT(property, setter) CATEGORY_PROPERTY_SET_NSNUMBER_PRIMITIVE(unsigned int, property, setter, numberWithUnsignedInt)
#define CATEGORY_PROPERTY_GET_SET_UINT(property, setter) CATEGORY_PROPERTY_GET_UINT(property) CATEGORY_PROPERTY_SET_UINT(property, setter)
ম্যাক্রো CATEGORY_PROPERTY_GET_SET
প্রদত্ত সম্পত্তির জন্য একজন গিটার এবং সেটার যুক্ত করে। কেবলমাত্র পঠনযোগ্য বা কেবল লেখার বৈশিষ্ট্য যথাক্রমে CATEGORY_PROPERTY_GET
এবং CATEGORY_PROPERTY_SET
ম্যাক্রো ব্যবহার করবে ।
আদিম ধরণেরগুলিকে আরও বেশি মনোযোগ দেওয়া দরকার
আদিম ধরণের কোনও বস্তু না হওয়ায় উপরের ম্যাক্রোগুলিতে unsigned int
সম্পত্তিটির ধরণ হিসাবে ব্যবহারের জন্য উদাহরণ রয়েছে । এটি কোনও NSNumber
বস্তুর মধ্যে পূর্ণসংখ্যার মানটি মোড়ক করে does সুতরাং এর ব্যবহার পূর্ববর্তী উদাহরণের সাথে অ্যানালগ:
@interface ...
@property unsigned int value;
@end
@implementation ...
CATEGORY_PROPERTY_GET_SET_UINT(value, setValue:)
@end
এই প্যাটার্ন অনুসরণ করে আপনি কেবল এছাড়াও সমর্থন করার জন্য আরো ম্যাক্রো যোগ করতে পারেন signed int
, BOOL
, ইত্যাদি ...
সীমাবদ্ধতা
সমস্ত ম্যাক্রো OBJC_ASSOCIATION_RETAIN_NONATOMIC
ডিফল্টরূপে ব্যবহার করছে ।
অ্যাপের কোডের মতো আইডিআই বর্তমানে সম্পত্তির নাম পুনরায় সংশোধন করার সময় সেটারের নামটি স্বীকৃতি দেয় না। আপনার নিজের এটির নতুন নামকরণ করতে হবে।