如何添加或替换现有objective-c类的方法?

时间:2011-02-17 07:35:01

标签: objective-c class

如果我想在任何类中添加一个函数,假设为Nsstring,或者覆盖该类的任何方法,我该如何做?

这是什么方法或代码?

2 个答案:

答案 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)