1

我们以这个方法为例:

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

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

4

2 回答 2

3

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

块是一个值。它是一个函数文字,就像“1”是一个整数文字或者@"string"是一个字符串文字。没有可混搭的对象或类。如果要修改值,则必须修改值,就像在示例中修改持续时间一样。

于 2015-05-12T22:48:47.200 回答
2

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

我猜你想要做的是:传递一个不同于animatedWithDuration:animations:completion:调用者提供的块;或将调用者提供的块包装在您自己的块中 - 这几乎是相同的事情。

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

高温高压

于 2015-05-12T23:39:10.203 回答