Daha iyi bir alternatif (bu uyarının sizi neden felaketten kurtardığına dair bneely'nin cevabına bakın), yöntemle karıştırmayı kullanmaktır. Metot karıştırmayı kullanarak, bir kategorideki mevcut bir metodu kimin "kazandığına" dair belirsizlik olmadan ve eski metoda çağrı yapma yeteneğini koruyarak değiştirebilirsiniz. İşin sırrı, geçersiz kılmaya farklı bir yöntem adı vermek, ardından bunları çalışma zamanı işlevlerini kullanarak değiştirmektir.
#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);
}
Ardından özel uygulamanızı tanımlayın:
+ (UIFont *)mySystemFontOfSize:(CGFloat)fontSize {
...
}
Varsayılan uygulamayı sizinkiyle geçersiz kılın:
MethodSwizzle([UIFont class], @selector(systemFontOfSize:), @selector(mySystemFontOfSize:));
super
başka türlü çağırabilirsiniz .