如何混入 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
我们以这种方法为例:
+ (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