Una mejor alternativa (vea la respuesta de bneely a por qué esta advertencia lo está salvando de un desastre) es usar el método swizzling. Al utilizar la combinación de métodos, puede reemplazar un método existente de una categoría sin la incertidumbre de quién "gana", y al mismo tiempo conservando la capacidad de llamar al método anterior. El secreto es darle a la anulación un nombre de método diferente y luego intercambiarlos usando funciones de tiempo de ejecución.
#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);
}
Luego defina su implementación personalizada:
+ (UIFont *)mySystemFontOfSize:(CGFloat)fontSize {
...
}
Anula la implementación predeterminada con la tuya:
MethodSwizzle([UIFont class], @selector(systemFontOfSize:), @selector(mySystemFontOfSize:));
super
otra manera.