2011-08-07 12 views
11

NSProxy Class Reference कहना है कि यह:एनएसपीरोक्सी "खुद को किसी अन्य वस्तु में कैसे बदलता है"?

आमतौर पर, एक प्रॉक्सी के लिए एक संदेश वास्तविक वस्तु के पास भेज या लोड करने के लिए (या अपने आप में बदलना) वास्तविक वस्तु प्रॉक्सी कारण बनता है।

वास्तव में "वास्तविक वस्तु में स्वयं को कैसे परिवर्तित करें" काम करेगा?

चीजों को थोड़ा और विशिष्ट बनाने के लिए, मान लीजिए कि कक्षा Foo में एक विधि newFooWithString: है जो एक स्ट्रिंग लेती है और Foo का एक नया उदाहरण देता है। क्या NSProxy को सेट करना संभव होगा, और यदि pleaseBecomeAFooUsingString: @"bar" संदेश प्राप्त हो गया है, तो खुद को अन्य संदर्भों के साथ गड़बड़ किए बिना, उसी स्मृति पर कब्जा कर लेते हुए, [Foo newFooWithString: @"bar"] में बदल जाता है?

उत्तर

6

यदि आपके पास कोड पर एक ही एनएसपीरोक्सी उदाहरण के लिए सूचक है और इसे "रूपांतरित" कर देगा, तो यह पूरे कोड में बदल जाएगा। ऑब्जेक्ट के लिए किसी विधि के कॉलर को अलग करने का कोई तरीका नहीं है, इसलिए आप स्वचालित रूप से अपने कोड में विधियों के आमंत्रण को अग्रेषित करने के लिए वैकल्पिक लक्ष्य नहीं कर पाएंगे। आम बदला जाने प्रॉक्सी होगा निम्नलिखित तरीके से दिखता है:

MyTrickyProxy.h

#import <Foundation/Foundation.h> 

@interface MyTrickyProxy : NSProxy { 
    NSObject *object; 
} 

- (id)transformToObject:(NSObject *)anObject; 

@end 

MyTrickyProxy.m

#import "MyTrickyProxy.h" 

@implementation MyTrickyProxy 

- (void)dealloc 
{ 
    [object release]; 
    object = nil; 

    [super dealloc]; 
} 

- (NSString *)description 
{ 
    return [object description]; 
} 

//Stupid transform implementation just by assigning a passed in object as transformation target. You can write your factory here and use passed in object as id for object that need ot be created. 
- (id)transformToObject:(NSObject *)anObject 
{ 
    if(object != anObject) { 
     [object release]; 
    } 
    object = [anObject retain]; 

    return object; 
} 

- (void)forwardInvocation:(NSInvocation *)invocation 
{ 
    if (object != nil) { 
     [invocation setTarget:object];  
     [invocation invoke]; 
    } 
} 

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel 
{ 
    NSMethodSignature *result; 
    if (object != nil) { 
     result = [object methodSignatureForSelector:sel]; 
    } else { 
     //Will throw an exception as default implementation 
     result = [super methodSignatureForSelector:sel]; 
    } 

    return result; 
} 

@end 

तो क्या आप का अनुरोध किया कोड-जादू के कुछ प्रकार है , लेकिन एनएसपीरोक्सी एक संदेश का एक सरल फॉरवर्डर है, बिल्कुल कोई जादू नहीं है, इसलिए आपका लक्ष्य आपके जैसा नहीं है का वर्णन किया।

+0

एनएसपीरोक्सी का उपयोग क्यों करें? आगे बढ़ाना एनएसओब्जेक्ट में भी उपलब्ध है। –

0

आप एनएसपीरोक्सी का एक उप-वर्ग बना सकते हैं जो उस वस्तु को बदलता है जो इसे आपके इच्छित मानदंडों के आधार पर करता है। तो आप ऑब्जेक्ट हमेशा एनएसपीरोक्सी को इंगित करेंगे लेकिन आप कृपया आइएयूयूयूयूंगस्ट्रिंग: ऑब्जेक्ट को इसे फू के रूप में बदल देंगे।

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