繁体   English   中英

如何陷入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:方法本身的不同或修改的实现。 如果我有兴趣对完成模块执行此操作怎么办?

混乱是指修改类或对象元数据,以便为给定的选择器调用不同的实现。 (这是一种非常脆弱且有些危险的技术,除非您非常了解自己在做什么,否则通常应在生产代码中避免使用这种技术;如果确实如此,则无论如何都会避免使用它。当它崩溃时,它会令人眼花blow乱,并使代码难以理解,但对调试和探索很有用。

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

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

我猜您想做的是:将不同于调用方提供的块传递给animatedWithDuration:animations:completion: 或将调用者提供的代码块包装在您自己的代码块中-大致相同。

如果我的猜测是正确的,则可以使用一种方法来替换该方法,该方法将调用您选择的原始传递块,该方法可能是调用者提供的块周围的包装。

高温超导

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM