如何混入 Objective-C 方法的完成块?

How to swizzle into completion block of an Objective-C method?

我们以这种方法为例:

+ (void)animateWithDuration:(NSTimeInterval)duration
                 animations:(void (^)(void))animations
                 completion:(void (^)(BOOL finished))completion

它很简单,可以在 animatedWithDuration:animations:completion: 方法本身的不同或修改的实现中混合。如果我反而有兴趣为完成块执行此操作怎么办?

Swizzling 是指修改 class 或对象元数据,以便为给定的选择器调用不同的实现。 (这是一种非常脆弱且有些危险的技术,通常应在生产代码中避免使用,除非您非常清楚自己在做什么,如果您知道,您可能无论如何都会避免使用它。当它爆炸时,它会爆炸并使代码难以理解。然而,它对调试和探索很有用。)

块是一个值。它是一个函数文字,就像“1”是一个整数文字或 @"string" 是一个字符串文字。没有对象或 class 可以混合。如果你想修改这个值,你必须修改这个值,就像你在你的例子中修改持续时间一样。

正如其他人所指出的,"swizzle" 用于指代更改方法实现,因此您用错了术语,但这并不重要。

我猜您想做的是:将与调用者提供的块不同的块传递给 animatedWithDuration:animations:completion:;或者将调用者提供的块包装在您自己的块中 - 这几乎是一样的。

如果我的猜测是正确的,那么您可以将方法替换为调用您选择的原始传递块的方法,这可能是调用者提供的块的包装器。

HTH