Objective-C中的方法Swizzling

我读了一篇关于“Objective-C中的方法Swizzling”的文章 。 在这篇文章中,“方法Swizzing”的含义是交换两种方法的实现。 示例如下所示:

- (void) logged_viewDidAppear:(BOOL)animated { [self logged_viewDidAppear:animated]; NSLog(@"logged view did appear for %@", [self class]); } + (void)load { static dispatch_once_t once_token; dispatch_once(&once_token, ^{ SEL viewWillAppearSelector = @selector(viewDidAppear:); SEL viewWillAppearLoggerSelector = @selector(logged_viewDidAppear:); Method originalMethod = class_getInstanceMethod(self, viewWillAppearSelector); Method extendedMethod = class_getInstanceMethod(self, viewWillAppearLoggerSelector); method_exchangeImplementations(originalMethod, extendedMethod); }); } - (void) logged_viewDidAppear:(BOOL)animated { [self logged_viewDidAppear:animated]; NSLog(@"logged view did appear for %@", [self class]); } 

在这篇文章中,一句话是

看起来这个方法对自己做了一个无意义的recursion调用,但是在我们调用它之后,实际上并不会这样做。

但是我不是很清楚这个说法,是不是说我们编写如下的代码:

 [self viewDidAppear], 

因为它的实现变成了“logged_viewDidAppear”,所以程序进入方法“logged_viewDidAppear”,在这个方法中,我们可以看到,第一行是[self logged_viewDidAppear:animated]; 出于同样的原因,该方法变成“viewDidAppear”。 我的话是正确的吗?

是的。 当调用viewDidAppear时,它实际上会在运行时被调用到logged_viewDidAppear的实现上,所以被调用的时候也会调用logged_viewDidApear。

检查这个: http : //nshipster.com/method-swizzling/和这个https://www.bignerdranch.com/blog/inside-the-bracket-part-7-runtime-machinations/

Interesting Posts