একটি আরও ভাল বিকল্প (কেন এই সতর্কতা আপনাকে বিপর্যয় থেকে বাঁচাচ্ছে তার জন্য হাফির উত্তর দেখুন) পদ্ধতিটি সুইজলিং ব্যবহার করা। পদ্ধতি সুইজলিং ব্যবহার করে, আপনি কে "বিজয়ী", এবং পুরানো পদ্ধতিতে কল করার ক্ষমতা রক্ষা করার অনিশ্চয়তা ছাড়াই কোনও বিভাগ থেকে একটি বিদ্যমান পদ্ধতি প্রতিস্থাপন করতে পারেন। রহস্যটি হ'ল ওভাররাইডকে একটি ভিন্ন পদ্ধতির নাম দেওয়া, তারপরে রানটাইম ফাংশনগুলি ব্যবহার করে এগুলি অদলবদল করা।
#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
অন্যথায় কল করতে পারেন।