Monkey在Objective-C中修补了一个实例

Dan*_*ark 2 objective-c

我试图从这里遵循(精彩)指令,但我有一个类的实例,我不能通过子类修改.有没有办法只将方法覆盖到类的实例?

Rob*_*ier 6

谨防.你即将在ObjC中输入一些相当深刻的魔法,你可以产生的各种错误是令人费解的.这些是在其他所有方法都失败后应该使用的最后一种技术,您应该尽一切可能隔离此代码.也就是说,ObjC是一种高度动态的语言,你可以重新连接大多数东西.

首先,对于您的具体问题,您可以更改实例的类,这将实现您想要的.规则基本上是:

  • 新类应该是前一类的子类
  • 新类不得添加任何ivars.在子类中添加ivars是导致上述令人费解的错误的原因之一.

如果你做错了,你将不会收到任何警告或错误.你只会遇到奇怪的崩溃.

鉴于此,更改对象的类实际上非常简单:

object->isa = [NewClass class];
Run Code Online (Sandbox Code Playgroud)

除此之外,您可以使用方法调配为每个类的实例更改方法的实现.我在使用method_exchangeImplementations()的Hijacking中有一些这样的例子.不过,一旦你完成了这个,你可以使用调试器.

  • 仔细使用的话,其实很简单。尽一切努力确保程序的其余部分都不关心它。这是 KVO 实现方式的一部分。当你第一次用 KVO 观察一个对象时,它的类会切换到一个神奇的 KVO 子类,该子类会修改所有访问器。一切都很好,你甚至没有注意到;但我确信调试 KVO 代码*本身*充其量只是一种娱乐。和你的问题一样;只需很好地记录下来,否则您将永远不会记得自己在做什么。 (2认同)