2013-02-25 61 views
8

क्या रनटाइम पर ऑब्जेक्ट के सुपरक्लास को बदलना संभव है? यदि हां, तो कैसे?किसी ऑब्जेक्ट के सुपरक्लास को गतिशील रूप से बदलें

+0

एक आईएसए स्विजल के उदाहरण के लिए http://stackoverflow.com/questions/11221110/my-isa-swizzling-breaks-kvo पर एक नज़र डालें। – mttrb

+1

इसके अलावा, "ऑब्जेक्ट के सुपरक्लास" का क्या अर्थ है? एक * ऑब्जेक्ट * में कोई सुपरक्लास नहीं है। एक वस्तु में एक वर्ग होता है और इसकी कक्षा में एक सुपरक्लास होता है। यदि आप, वस्तु के वर्ग के सुपरक्लास को बदलते हैं, ** उस वर्ग के सभी सदस्य प्रभावित होंगे, ** न केवल उस वस्तु को। –

+2

क्यों सुपर क्लास वर्तमान वर्ग नहीं है? वर्तमान वर्ग के साथ क्या होता है? आपको पहले सावधानी से सोचना होगा –

उत्तर

11

एक छोटा सा सवाल है, एक संक्षिप्त उत्तर:

मैं है एक वर्ग है कि किसी REST- एपीआई के लिए कनेक्शन संभालती है, यह है: हाँ, इसा

What Makes Objective C Dynamic?, page 66


एक उदाहरण swizzling एपीआईसीलिएंट कहा जाता है। परीक्षण में मैं एक अलग सर्वर से कनेक्ट करना चाहता हूं।

परीक्षण लक्ष्य में मैं APIClient

#import "ApiClient.h" 

@interface TestApiClient : ApiClient 
//… 
@end 


@interface TestApiClient() 
@property (nonatomic, strong, readwrite) NSURL *baseURL; 

@end 


@implementation TestApiClient 

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method 
             path:(NSString *)path 
           parameters:(NSDictionary *)parameters 
{ 
    self.baseURL = [NSURL URLWithString:@"http://localhost:8000/"]; 
    return [super requestWithMethod:method path:path parameters:parameters]; 
} 

@end 

उपवर्ग इकाई परीक्षण वर्ग मैं swizzling #import कर में

@implementation APIUnitTests 


+(void)load 
{ 
    client = [[ApiClient alloc ] init]; 
    object_setClass(client, [TestApiClient class]); 
} 

//… 
@end 

यह cas बचाने के लिए, के रूप में मैं पहली बार एक का एक उपवर्ग बनाई गई है बेस क्लास और फिर बाद वाले को उप-वर्ग के साथ बदल दिया। चूंकि सबक्लास भी एक बेस क्लास है, यह वैध विरासत है।

+1

यह बेहद खतरनाक लगता है। आप पृथ्वी पर क्यों चाहेंगे? –

+1

यदि सही हो तो यह बहुत शक्तिशाली है, सेब इसका उपयोग केवीओ के लिए करता है: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOImplementation.html – vikingosegundo

+0

मैं व्यक्तिगत रूप से इसका निरीक्षण करने के लिए उपयोग करता हूं कोड: मैं कुछ सूचनाओं को लॉग इन करने और सुपर पर मूल विधियों को कॉल करने के लिए रुचि रखने वाली विधियों को उप-वर्गीकृत करता हूं और ओवरराइट करता हूं। – vikingosegundo

2

ओबीजेसी रनटाइम का उपयोग करना निश्चित रूप से संभव है, लेकिन यह थोड़ा बालों वाला होगा ... यह ऐप्पल के दस्तावेज़ों का एक लिंक है: Objective-C Runtime और इसके उपयोग का एक उदाहरण: Objective-C Runtime Programming