क्या रनटाइम पर ऑब्जेक्ट के सुपरक्लास को बदलना संभव है? यदि हां, तो कैसे?किसी ऑब्जेक्ट के सुपरक्लास को गतिशील रूप से बदलें
उत्तर
एक छोटा सा सवाल है, एक संक्षिप्त उत्तर:
मैं है एक वर्ग है कि किसी 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 बचाने के लिए, के रूप में मैं पहली बार एक का एक उपवर्ग बनाई गई है बेस क्लास और फिर बाद वाले को उप-वर्ग के साथ बदल दिया। चूंकि सबक्लास भी एक बेस क्लास है, यह वैध विरासत है।
यह बेहद खतरनाक लगता है। आप पृथ्वी पर क्यों चाहेंगे? –
यदि सही हो तो यह बहुत शक्तिशाली है, सेब इसका उपयोग केवीओ के लिए करता है: http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserving/Articles/KVOImplementation.html – vikingosegundo
मैं व्यक्तिगत रूप से इसका निरीक्षण करने के लिए उपयोग करता हूं कोड: मैं कुछ सूचनाओं को लॉग इन करने और सुपर पर मूल विधियों को कॉल करने के लिए रुचि रखने वाली विधियों को उप-वर्गीकृत करता हूं और ओवरराइट करता हूं। – vikingosegundo
ओबीजेसी रनटाइम का उपयोग करना निश्चित रूप से संभव है, लेकिन यह थोड़ा बालों वाला होगा ... यह ऐप्पल के दस्तावेज़ों का एक लिंक है: Objective-C Runtime और इसके उपयोग का एक उदाहरण: Objective-C Runtime Programming।
एक आईएसए स्विजल के उदाहरण के लिए http://stackoverflow.com/questions/11221110/my-isa-swizzling-breaks-kvo पर एक नज़र डालें। – mttrb
इसके अलावा, "ऑब्जेक्ट के सुपरक्लास" का क्या अर्थ है? एक * ऑब्जेक्ट * में कोई सुपरक्लास नहीं है। एक वस्तु में एक वर्ग होता है और इसकी कक्षा में एक सुपरक्लास होता है। यदि आप, वस्तु के वर्ग के सुपरक्लास को बदलते हैं, ** उस वर्ग के सभी सदस्य प्रभावित होंगे, ** न केवल उस वस्तु को। –
क्यों सुपर क्लास वर्तमान वर्ग नहीं है? वर्तमान वर्ग के साथ क्या होता है? आपको पहले सावधानी से सोचना होगा –