Eine bessere Alternative (siehe bneelys Antwort darauf, warum diese Warnung Sie vor einer Katastrophe bewahrt) ist die Verwendung von Methoden-Swizzling. Durch die Verwendung von Methoden-Swizzling können Sie eine vorhandene Methode aus einer Kategorie ersetzen, ohne die Unsicherheit darüber zu haben, wer "gewinnt", und gleichzeitig die Möglichkeit zu bewahren, die alte Methode aufzurufen. Das Geheimnis besteht darin, der Überschreibung einen anderen Methodennamen zu geben und sie dann mithilfe von Laufzeitfunktionen auszutauschen.
#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);
}
Definieren Sie dann Ihre benutzerdefinierte Implementierung:
+ (UIFont *)mySystemFontOfSize:(CGFloat)fontSize {
...
}
Überschreiben Sie die Standardimplementierung mit Ihrer:
MethodSwizzle([UIFont class], @selector(systemFontOfSize:), @selector(mySystemFontOfSize:));
super
anders aufrufen .