如果我想在任何类中添加一个函数,假设为Nsstring,或者覆盖该类的任何方法,我该如何做?
这是什么方法或代码?
答案 0 :(得分:5)
如果我想添加一个功能:
创建一个类别:
@interface NSString (MONAdditions)
- (BOOL)mon_isDirectoryWritable;
@end
@implementation NSString (MONAdditions)
- (BOOL)mon_isDirectoryWritable { return random(); }
@end
(注意:此处使用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);
}
答案 1 :(得分:0)