Alternatif yang lebih baik (lihat jawaban Bneely mengapa peringatan ini menyelamatkan Anda dari bencana) adalah dengan menggunakan metode swizzling. Dengan menggunakan metode swizzling, Anda dapat mengganti metode yang ada dari kategori tanpa ketidakpastian siapa yang "menang", dan sambil mempertahankan kemampuan untuk memanggil metode lama. Rahasianya adalah dengan memberi penggantian nama metode yang berbeda, lalu menukarnya menggunakan fungsi runtime.
#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);
}
Kemudian tentukan implementasi kustom Anda:
+ (UIFont *)mySystemFontOfSize:(CGFloat)fontSize {
...
}
Timpa penerapan default dengan Anda:
MethodSwizzle([UIFont class], @selector(systemFontOfSize:), @selector(mySystemFontOfSize:));
super
sebaliknya.