代码之家  ›  专栏  ›  技术社区  ›  Dan Rosenstark

Objective-C中的Monkey补丁实例

  •  2
  • Dan Rosenstark  · 技术社区  · 14 年前

    here ,但我有一个不能通过子类化修改的类的实例。有没有办法只重写类实例的方法?

    2 回复  |  直到 7 年前
        1
  •  6
  •   Rob Napier    14 年前

    当心。您将要在ObjC中输入一些相当深的魔法,并且您可以生成的各种bug都是令人费解的。这些是在其他所有操作都失败之后应该使用的最后一种技术,您应该尽可能地隔离这些代码。也就是说,ObjC是一种高度动态的语言,您可以重新构建大多数东西。

    • 新类应该是前一个类的子类
    • 新类不能添加任何ivar。在子类中添加ivar是导致上述令人费解的bug的原因之一。

    如果你做错了,你不会得到任何警告或错误。你只会得到奇怪的崩溃。

    object->isa = [NewClass class];
    

    Hijacking with method_exchangeImplementations() . 不过,在完成此操作之后,祝您使用调试器好运。

        2
  •  1
  •   Jared Pochtar    14 年前

    实际上,您可以通过子类化修改任何内容。这是您可以做的最微妙的事情之一,您可以研究方法swizling(但是方法swizling会影响类的所有成员),但是在objective c中,设置任何对象的类都非常容易,所以基本上您只需要声明一个子类,而不声明任何额外的IVAR,并且只重写所需的方法(您可能希望调用超级实现),然后在运行时通过object\u setClass(在中声明)更改对象的类。