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

如何添加或替换现有objective-c类的方法?,objective-c,class,Objective C,Class,如果我想在任何类中添加一个函数,或者覆盖该类的任何方法,我该怎么做 这是什么方法或代码 如果我想添加一个函数: 创建一个类别: @interface NSString (MONAdditions) - (BOOL)mon_isDirectoryWritable; @end @implementation NSString (MONAdditions) - (BOOL)mon_isDirectoryWritable { return random(); } @end 注意:这里使用mon_u作为

如果我想在任何类中添加一个函数,或者覆盖该类的任何方法,我该怎么做

这是什么方法或代码

如果我想添加一个函数:

创建一个类别:

@interface NSString (MONAdditions)
- (BOOL)mon_isDirectoryWritable;
@end
@implementation NSString (MONAdditions)
- (BOOL)mon_isDirectoryWritable { return random(); }
@end
注意:这里使用mon_u作为选择器的前缀-这是一个非常好的分类方法实践

或者覆盖该类的任何方法,我如何才能做到这一点

出于显而易见的原因,您不应该这样做,尤其是对于NSString。但是

在objc/runtime.h中有几个选项。方法交换实施提供了一种简单的方法:

#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);
}

您正在谈论的是在objective c中的子类化,请查看链接


如果可以的话,我有一个问题:你为什么使用前缀MON?也许是法语?@bajaha,是的,这是一个法语派生词——人们通常会在objc示例代码中写“MyClass”,我写“MONClass”。然而,我既不是法国人,也不会正确发音。我们还可以改写类的方法,对此我100%肯定。@Heart PAL我不确定你在问我什么。然而,我在更新的答案中演示了一个实现。在向类添加方法时要非常小心。不要替换现有的方法。即使调用原始实现也不行。一级封装破损,有。