Một giải pháp thay thế tốt hơn (xem câu trả lời của bneely về lý do tại sao cảnh báo này cứu bạn khỏi thảm họa) là sử dụng phương pháp swizzling. Bằng cách sử dụng phương thức swizzling, bạn có thể thay thế một phương thức hiện có từ một danh mục mà không cần chắc chắn ai "thắng" và trong khi vẫn bảo toàn khả năng gọi đến phương thức cũ. Bí quyết là đặt cho phương thức ghi đè một tên khác, sau đó hoán đổi chúng bằng các hàm thời gian chạy.
#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);
}
Sau đó, xác định triển khai tùy chỉnh của bạn:
+ (UIFont *)mySystemFontOfSize:(CGFloat)fontSize {
...
}
Ghi đè triển khai mặc định bằng của bạn:
MethodSwizzle([UIFont class], @selector(systemFontOfSize:), @selector(mySystemFontOfSize:));
super
cách khác.