5

जैसा कि हम जानते हैं, हम एक श्रेणी और रनटाइम विधियों जैसे objc_setAssociatedObject और objc_getAssociatedObject का उपयोग करके उद्देश्य-सी में एक चर जोड़ सकते हैं। उदाहरण के लिए:objc_setAssociatedObject कैसे काम करता है?

#import <objc/runtime.h> 
@interface Person (EmailAddress) 
@property (nonatomic, readwrite, copy) NSString *emailAddress; 
@end 

@implementation Person (EmailAddress) 

static char emailAddressKey; 

- (NSString *)emailAddress { 
    return objc_getAssociatedObject(self, 
            &emailAddressKey); 
} 

- (void)setEmailAddress:(NSString *)emailAddress { 
    objc_setAssociatedObject(self, 
          &emailAddressKey, 
          emailAddress, 
          OBJC_ASSOCIATION_COPY); 
} 
@end 

लेकिन किसी को क्या objc_getAssociatedObject या objc_setAssociatedObject क्या करता है पता है? मेरा मतलब है, हम ऑब्जेक्ट में वेरिएबल कहां जोड़ते हैं (यहां self है) संग्रहीत? और परिवर्तनीय और self के बीच संबंध?

+1

संपत्ति का उपयोग न करने का कोई कारण? मैं यह समझने के बिना रनटाइम के साथ गड़बड़ करने की कोशिश नहीं करता कि यह कैसे काम करता है। –

+3

[यहां है] (http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-runtime.mm) उनके कार्यान्वयन। –

+1

@ एच 2CO3, वास्तव में दिलचस्प कोड वाली फ़ाइल objc-references.mm है: http://www.opensource.apple.com/source/objc4/objc4-532/runtime/objc-references.mm –

उत्तर

8

उद्देश्य-सी रनटाइम में संबंधित वस्तुओं के लिए कोड objc-references.mm में है।

अगर मैं इसे सही ढंग से समझते हैं, वहाँ एक वैश्विक हैश नक्शा (class AssociationsManager में static AssociationsHashMap *_map) कि एक वस्तु का पता नक्शे (uintptr_t के रूप में "प्रच्छन्न") एक ObjectAssociationMap है।

ObjectAssociationMap भंडार एक विशेष वस्तु के लिए सभी संगठनों और बनाए जाने पर

एक वस्तु के लिए पहली बार कहा जाता है।

ObjectAssociationMap एक हैश नक्शा है कि नक्शे value और policy करने के लिए key है।

जब कोई ऑब्जेक्ट डिलीकेट किया जाता है, _object_remove_assocations() सभी संगठनों को हटा देता है और यदि आवश्यक हो तो मान जारी करता है।

+0

आप सही हैं, एक वैश्विक हैश नक्शा रनटाइम के स्वामित्व में है, और सभी संबंधित वस्तुओं को मानचित्र द्वारा संग्रहीत किया जाता है। बहुत बहुत धन्यवाद! – foogry

+0

@ वांगज़: आपका स्वागत है! –

संबंधित मुद्दे