एक बेहतर विकल्प (देखें कि इस चेतावनी आपको आपदा से क्यों बचा रही है) का जवाब है, पद्धति का उपयोग करना है। विधि स्विज़लिंग का उपयोग करके, आप "जीत" की अनिश्चितता के बिना किसी श्रेणी से मौजूदा पद्धति को बदल सकते हैं, और पुरानी पद्धति से कॉल करने की क्षमता को संरक्षित करते हुए। रहस्य ओवरराइड को एक अलग विधि का नाम देना है, फिर रनटाइम फ़ंक्शन का उपयोग करके उन्हें स्वैप करें।
#import <objc/runtime.h>
#import <objc/message.h>
void MethodSwizzle(Class c, SEL orig, SEL new) {
Method origMethod = class_getInstanceMethod(c, orig);
Method newMethod = class_getInstanceMethod(c, new);
if(class_addMethod(c, orig, method_getImplementation(newMethod), method_getTypeEncoding(newMethod)))
class_replaceMethod(c, new, method_getImplementation(origMethod), method_getTypeEncoding(origMethod));
else
method_exchangeImplementations(origMethod, newMethod);
}
फिर अपने कस्टम कार्यान्वयन को परिभाषित करें:
+ (UIFont *)mySystemFontOfSize:(CGFloat)fontSize {
...
}
आपके साथ डिफ़ॉल्ट कार्यान्वयन को ओवरराइड करें:
MethodSwizzle([UIFont class], @selector(systemFontOfSize:), @selector(mySystemFontOfSize:));
super
अन्यथा कॉल करें ।