如果我想添加一个功能:
创建一个类别:
@interface NSString (MONAdditions)
- (BOOL)mon_isDirectoryWritable;
@end
@implementation NSString (MONAdditions)
- (BOOL)mon_isDirectoryWritable { return random(); }
@end
Run Code Online (Sandbox Code Playgroud)
(注意:mon_这里用作选择器的前缀 - 这是一种非常好的类别方法练习)
或覆盖该类的任何方法我该怎么做?
出于显而易见的原因,你不应该这样做,特别是对于NSString.但...
你有几个选择objc/runtime.h.method_exchangeImplementations提供一个简单的方法:
#include <objc/runtime.h>
@interface MONSwap : NSObject
/*...*/
- (void)makeCoffee;
- (void)goToSleep;
@end
@implementation MONSwap
- (void)makeCoffee
{
self.coffeeMachine.brew;
}
- (void)goToSleep
{
self.electricity.disable;
}
@end
void LetsPlayAnEvilTrick() {
Class swap = [MONSwap class];
// see also class_getClassMethod
Method a = class_getInstanceMethod(swap, @selector(makeCoffee));
Method b = class_getInstanceMethod(swap, @selector(goToSleep));
method_exchangeImplementations(a, b);
}
Run Code Online (Sandbox Code Playgroud)