10

मुझे कक्षा में निजी संपत्तियों को उस कक्षा के कार्यान्वयन (.m) फ़ाइल में घोषित उस वर्ग पर एक अज्ञात श्रेणी के अंदर डालने की संभावना के बारे में पता है। यह नहीं है जो मैं करना चाहता हूं।मैं नामित श्रेणी के भीतर एक निजी संपत्ति कैसे घोषित कर सकता हूं?

मैं कक्षा में एक नामित श्रेणी से निपट रहा हूं जो उस वर्ग में कुछ कार्यक्षमता जोड़ता है। इस कार्यक्षमता के लिए, यह मेरी श्रेणी में उपयोग करने के लिए निजी संपत्ति रखने में बहुत मदद करेगा - इसलिए इसे प्राप्त करने का सामान्य तरीका (ऊपर वर्णित) मेरे लिए काम नहीं कर रहा है। या यह करता है? कृपया मुझे ज्ञान दो!

उत्तर

22

अपनी श्रेणी की कार्यान्वयन फ़ाइल के अंदर, एक और श्रेणी घोषित करें और इसे MyCategoryName_Private जैसे कुछ कहें, और वहां अपनी निजी संपत्तियां घोषित करें। संबंधित वस्तुओं का उपयोग कर -propertyName और -setPropertyName: विधियों के कार्यान्वयन प्रदान करें।

उदाहरण के लिए, अपने कार्यान्वयन फ़ाइल इस प्रकार दिखाई देंगे:

#import "SomeClass+MyCategory.h" 
#import <objc/runtime.h> 

@interface SomeClass (MyCategory_Private) 

@property (nonatomic, strong) id somePrivateProperty; 

@end 

@implementation SomeClass (MyCategory_Private) 

static void *AssociationKey; 

- (id)somePrivateProperty 
{ 
    return objc_getAssociatedObject(self, AssociationKey); 
} 

- (void)setSomePrivateProperty:(id)arg 
{ 
    objc_setAssociatedObject(self, AssociationKey, arg, OBJC_ASSOCIATION_RETAIN); 
} 

@end 

@implementation SomeClass (MyCategory) 

// implement your publicly declared category methods 

@end 
+1

Yahey, आपको बहुत बहुत धन्यवाद! यही वही है जो मैं ढूंढ रहा हूं! हो सकता है कि कुछ लोग इसे सबसे अच्छा कोडिंग अभ्यास न मानें, एक श्रेणी को पूरी तरह से'.एम 'फ़ाइल में डाल दें, लेकिन फिर भी यह मेरी समस्या हल करता है और मेरे लिए सामान को अधिक आसान बनाता है :) –

+1

सुंदर। धन्यवाद! – theDuncs

+0

मुझे लगता है कि अगर मुझे और अधिक निजी संपत्तियां मिलनी हैं तो मुझे अधिक एसोसिएशन बनाना चाहिए? – allenlinli